Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: отловить событие ajax

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: отловить изменение <select>
DlTA
Отправлено: 13 Июня, 2011 - 01:53:52
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




пишу пользовательский скрипт *.user.js
имеется некоторый сайт на котором есть 2 выпадающих списка
на первый список по событию onchange() происходит ajax запрос при котором генерируется контент второго списка

мне нужно произвести скриптами выбор из первого и второго списка, но сложность в том что во втором списке выбирать нечего (он еще не подгуржен)

я произвел выбор в первом, потом сэмулировал событие onchange() для первого списка, и при этом произошол вызов функций сайта которые и заполнили второй список,
но вот как теперь красиво привязать выбор во втором списке я не знаю,
единственное что у меня получилось это по таймеру (после вызова onchange()) произвести выбор из второго списка (типа даем время подгрузиться второму списку и производим из него выбор) но этот вариант мне не нравится, так как за выделенные 0,5с список может и не подгузиться, а если ставить больше то будет мешать юзеру, хотелось бы отловить завершение запроса (а точнее уже когда будет сформирован второй список) и уже тогда производить выбор

подскажите кто чем может.))

дебажу в хроме, но вообще пишется под мозилу
 
 Top
DeepVarvar Супермодератор
Отправлено: 13 Июня, 2011 - 05:53:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




А у джквери-аякса есть такая штука:

success: function() {.......

Или на чистом жабаскрипте:

if (xhr.readyState == 4 && xhr.status == 200) {.... делаем что надо и только потом спокойно делаем выборку из обоих селектов
 
 Top
DlTA
Отправлено: 13 Июня, 2011 - 10:18:56
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




повторюсь
второй селект еще неимеет списка
он появляется только после того как произойдет выбор из первого


можно конечно скопипастить вызываемые функции в свой скрипт и вызвать по необходимости (почему то пространство имен у юзер скриптов и у страничных разные, и вызвать просто так не получается)
(Добавление)
усе на чистом
этоже пользовательский
 
 Top
DeepVarvar Супермодератор
Отправлено: 13 Июня, 2011 - 13:49:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DlTA пишет:
он появляется только после того как произойдет выбор из первого


Повесить обработчик:
CODE (javascript):
скопировать код в буфер обмена
  1. var eachOptions = {
  2.   update: function() {
  3.     this.options = document.getElementById("selectid").getElementsByTagName("option");
  4.     for (var l = 0; l < this.options.length; l++) {
  5.       this.options[l].onclick = eachOptions.changehandler;
  6.       }
  7.     },
  8.   changehandler: function() {
  9.     alert(this.value);
  10.     return true;
  11.     }
  12.   }


Когда в DOM придут новые опшны, выполнить: eachOptions.update;
Действия в хендлере поменяй на нужные тебе...
 
 Top
DlTA
Отправлено: 13 Июня, 2011 - 23:51:22
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




чет я не догоняю
вот к примеру у меня грузится страница
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <script>
  3.   function change_bra(...)
  4.   { // производит ajax запрос для получаения списка для второго селекта, и заполняет селект    
  5.   }
  6. </script>
  7. ...
  8. <select id='select_1' onchange='change_bra(...)>
  9.   <option value='0' >чета там 0</option>
  10.   ...
  11.   <option value='100' >чета там 100</option>
  12. </select>
  13. и
  14. <select id='select_2'>
  15.   <option value='0' >список пуст</option>
  16. </select>
  17. ...

куда мне лепить тут eachOptions и как оно отследит изменения в структуре второго селекта? судя из кода оно всего лишь получает выбранный option-с, и то по клику пользователя, пользователь у меня не кликает, все делается скриптами.
DlTA пишет:
мне нужно произвести скриптами выбор из первого и второго списка, но сложность в том что во втором списке выбирать нечего (он еще не подгуржен)

я произвел выбор в первом, потом сэмулировал событие onchange() для первого списка, и при этом произошол вызов функций сайта которые и заполнили второй список,
 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Июня, 2011 - 00:11:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Да блин... выкинь второй метод (он для примера), оставь только "update",
запускай его после прихода новых опшнов в "наблюдаемый" селект,
все они со своими значениями будут в массиве.
Собирай из массива данные или ищи в нем selected и используй куда надо...
(Добавление)
DlTA пишет:
получает выбранный option-с, и то по клику пользователя

Нет - он их все в массив собирает, а на клик каждого из элементов повешен event (событие).
Но событие можно и не на клик повесить, если оно вообще надо.
 
 Top
DlTA
Отправлено: 14 Июня, 2011 - 09:58:53
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




DeepVarvar пишет:
запускай его после прихода новых опшнов в "наблюдаемый" селект,
как я могу узнать что они пришли?
 
 Top
DlTA
Отправлено: 17 Июня, 2011 - 12:02:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




в общем, так как элегантного решения я не нашел
пришлось лепить костыли
реализовал следующим образом:
после осуществления выбора из первого селекта произвожу мониторинг состояния второго селекта, через каждые 0,1 секунды, как только во втором селекте появилось много (больше одного) оптиона, и произвожу выбор из второго селекта. после чего благополучно отправляю всю форму
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июня, 2011 - 12:20:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DlTA пишет:
как я могу узнать что они пришли?

DeepVarvar пишет:
if (xhr.readyState == 4 && xhr.status == 200) {....
 
 Top
DlTA
Отправлено: 17 Июня, 2011 - 13:56:56
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




DeepVarvar пишет:
xhr
я так подозреваю что это объект XMLHttpRequest
и для того чтоб опрашивать его статус нужно как минимум быть внутри функции обработчика
.onreadystatechange, ну и чтоб переменная была видна.

как то геморно получается
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июня, 2011 - 14:39:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DlTA пишет:
быть внутри функции обработчика

нет - просто оттуда вызвать ф-цию которая будет уже собирать значения с пришедшего селекта. А где эта ф-ция будет находится - значения не имеет, усеравно в объекте.
 
 Top
DlTA
Отправлено: 17 Июня, 2011 - 16:09:15
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




но к самому объекту ведь надо получить доступ?!
а он генерируется и используется в функции исходной страницы.
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июня, 2011 - 17:35:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DlTA мне кажется что мы либо говорим об одном и том же на разных я зыках, либо на одном языке о разном..
цинкани в личку аську чтоли, ато так и будем перекидываться фразами Закатив глазки
 
 Top
DlTA
Отправлено: 18 Июня, 2011 - 00:03:53
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




скорее второе,
весь разговор похож примерно на следующее:
Я. как узнать, что что-то там изменилось
ТЫ. посмотреть статус
Я. как получить доступ к объекту, статус которого надо посмотреть
ТЫ. посмотреть статус
...
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Июня, 2011 - 01:44:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Хорошо...

По событию onchange на первом селекте отправляется запрос на сервер за списком опшнов для второго селекта. После того как статус ответа будет таким как я привел выше:
для чистого жаваскрипт:
CODE (javascript):
скопировать код в буфер обмена
  1. if (xhr.readyState == 4 && xhr.status == 200) {
  2.   // ф-ция place() собирает в цикле опшны
  3.   place(eval("(" + xhr.responseText + ")"));
  4.   }

или для jquery:
CODE (javascript):
скопировать код в буфер обмена
  1. success: function(data) {
  2.   // тут тот же самый place()
  3.   place(data); // eval не нужен, это уже объект
  4.   }

Это ответ сервера:
PHP:
скопировать код в буфер обмена
  1. $data = array();
  2. $cnt = mt_rand(6,20);
  3. for ($i = 0; $i < count($cnt); $i++) {
  4.   $data[$i] = '<option value="'.$i.'">'.md5($i).'</option>';
  5.   }
  6. die(json_encode($data));

А это ф-ция place()
CODE (javascript):
скопировать код в буфер обмена
  1. function place(data) {
  2.   var select = document.getElementById("selectid");
  3.   for (var i = 0; i < data.length; i++) {
  4.     select.innerHTML += data[i];
  5.     }
  6.   }

После того как второй селект построен, запускаем ф-цию:
CODE (javascript):
скопировать код в буфер обмена
  1. var options = new Array;
  2. function getOptionsForNewSelect() {
  3.   options = document.getElementById("selectid").getElementsByTagName("option");
  4.   for (var l = 0; l < options.length; l++) {
  5.     alert(options[l].value);
  6.     }
  7.   }

И видим что все новые пришедшие значения опшнов находятся в нашем массиве.
Ты еще спроси - почему это функция getOptionsForNewSelect() увидела вдруг переменную "options" которая находится вне её тела...
Может быть проблема была только в этом (сужу по вопросу: как получить доступ к объекту, статус которого надо посмотреть)?
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB