Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2009, 18:21
Новичок на форуме
Отправить личное сообщение для Werewolf Посмотреть профиль Найти все сообщения от Werewolf
 
Регистрация: 17.03.2009
Сообщений: 2

Select'ы + AJAX
Я хочу сделать три селекта, зависимые друг от друга, то есть выбрал что-то в первом, поменялись два других.
<script type="text/javascript">
selectors = new Array('ctlArtist','ctlAlbum','ctlSong');
var generateList = function(j) {
	var options = '';
	for (var i = 0; i < j.options.length; i++) {
		options += '<option value="' + j.options[i].optionValue + '">' + j.options[i].optionDisplay + '</option>';
	}
	$("select#"+selectors[j.level]).html(options);
}
$(document).ready(function(){
  $("select#ctlArtist").change(function(){
    $.getJSON("select.php",{id: $(this).val(), level: 1}, generateList);
    $("select#ctlAlbum").trigger("change");
  });
  $("select#ctlAlbum").change(function(){
    $.getJSON("select.php",{id: $(this).val(), level: 2}, generateList);
  });
});
</script>

Три селекта ctlArtist,ctlAlbum,ctlSong. Значения подгружаются из select.php. Когда выбираю что-нибудь в первом, во втором селекте должно произойти заполнение опциями второго селекта, а затем вызывается событие change для него, но он(второй селект) считает, что значения у него не поменялись! Меняются они судя по всему после функции-колбека, а нужно в самой функции.

Как это можно исправить?

Последний раз редактировалось Werewolf, 17.03.2009 в 18:49.
Ответить с цитированием
  #2 (permalink)  
Старый 17.03.2009, 19:15
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Это настолько стандартная задача, что даже на этом форуме несколько раз обсуждалась.
Ответить с цитированием
  #3 (permalink)  
Старый 18.03.2009, 08:56
Новичок на форуме
Отправить личное сообщение для Werewolf Посмотреть профиль Найти все сообщения от Werewolf
 
Регистрация: 17.03.2009
Сообщений: 2

Сразу говорю, у меня select'ы уже присутствуют на странице.
selectors = new Array('ctlArtist','ctlAlbum','ctlSong');
var generateList = function(j) {
	var options = '';
	for (var i = 0; i < j.options.length; i++) {
		options += '<option value="' + j.options[i].optionValue + '">' + j.options[i].optionDisplay + '</option>';
	}
	$("select#"+selectors[j.level]).html(options);
	console.log(1+"\n"+$("select#"+selectors[j.level]).html());
}
$(document).ready(function(){
	$("select#ctlArtist").change(function(){
		$.getJSON("select.php",{id: $(this).val(), level: 1}, generateList);
		console.log(2+"\n"+$("select#ctlAlbum").html());
	});
});

В консоли Firebug'а показывает вначале данные вторым console.log и только затем из первого. Получается функция-обработчик выполняется асинхронно и запаздывает.

Я нашел решение с использованием setTimeout:
setTimeout('$("select#ctlAlbum").trigger("change")', 1);

В этом случае вначале выполнится обработчик, и только затем сработает триггер.
Ответить с цитированием
  #4 (permalink)  
Старый 18.03.2009, 12:53
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

а что тебе мешает генерировать change для 2-го списка в обработчике $.getJSON 1-го?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка при использовании Ajax Nichloas AJAX и COMET 9 17.09.2009 16:06
Неверный результат в AJAX с получением HTML Raynor AJAX и COMET 3 17.12.2008 18:38
AJAX и БД SunYang AJAX и COMET 3 06.06.2008 22:44
Ajax & Autorun Ergall-M AJAX и COMET 11 08.05.2008 15:33
как дождаться AJAX ответа scuter Общие вопросы Javascript 3 23.03.2008 05:54