jQuery change () не запускает обработчики событий прототипа - PullRequest
4 голосов
/ 18 марта 2011

У меня есть существующая база кода прототипа, которая выполняет изменения в selectbox ...

Я использовал jQuery, который генерирует (стилизованные) неупорядоченные списки, и я хочу, чтобы прокси-клики по этому списку попадали в мой selectbox ... Это все работает нормально (вызывая val () для selectbox), но прототип не подхватывает эти изменения, даже когда я явно вызываю change () на панели выбора ... Кто-нибудь знает, что происходит?

Я мог бы опубликовать кучу кода, но все это очень просто, я думаю, что единственная важная часть:

parent_obj.val (selected_idx) .Кнопкой ();

Который изменяет выбранный элемент в моем окне выбора, но не запускает мой обработчик событий прототипа.

редактирование:

Вероятно, будет ответ об использовании триггера () и т. Д., Который, похоже, тоже не работает:

parent_obj.val(selected_idx).click().change().trigger('click');
parent_obj.find('option value[' + selected_idx + ']').click().change().trigger('click');

Ответы [ 5 ]

3 голосов
/ 30 мая 2011

Я закончил тем, что использовал прототип Event.simulate в соответствии с этим ответом;

Запуск события с прототипом

1 голос
/ 29 июня 2016

Я решил проблему, используя смесь jQuery и Javascript ванили

parent_obj.val(selected_idx);
parent_obj.get(0).dispatchEvent(new Event('change'));
1 голос
/ 18 марта 2011

Все trigger (или change, что является просто ярлыком для trigger('change')), вызывает связанные обработчики событий jQuery. Изменение значения из javascript также не запускает обработчики (подумайте обо всех бесконечных циклах, которые могут вызвать!). В общем, нет надежного способа запуска событий из JavaScript. Вы, вероятно, должны использовать единый каркас для обработки событий. В противном случае вы должны найти эквивалент прототипа trigger и вызвать его вручную.

0 голосов
/ 12 февраля 2016

Итак, решение состоит в том, чтобы использовать «simulate.js», потому что вы не можете запустить событие, зарегистрированное в прототипе, с помощью jQuery.

Поработав несколько минут, я понял, что для того, чтобы «simulate.js» работалпри выборе опции она должна быть выбрана опция, которую вы хотите первой В моем примере я хочу, чтобы последняя опция была выбрана по умолчанию

$$('select#shipping_method option').last().selected=true;
$$('select#shipping_method option').last().simulate('change');

Привет

0 голосов
/ 18 марта 2011

Вероятно, вам нужно посмотреть на использование jQuery.noConflict() здесь, а затем обеспечить изоляцию.http://api.jquery.com/jQuery.noConflict/

Смотрите этот пост о прототипах событий: Инициируйте событие с помощью прототипа

...