Виджеты пользовательского интерфейса jQuery (т.е. Slider) и запуск их пользовательских обработчиков событий - PullRequest
3 голосов
/ 24 мая 2011

Если мы связываем событие click со ссылкой как

$("linkSelector").click(function(){ ... });

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

$("linkSelector").click(function() { ... }).click();

Но в моем случае я использую jQuery Виджет-слайдер , который имеет событие slide, к которому может быть привязан обработчик события. Интересно, как мы можем принудительно выполнить его события программно?

Я пробовал следующее, но ни один из них не работает:

$("sliderSelector").slider({ slide: function(){ ... } }).slide();
$("sliderSelector").slider({ slide: function(){ ... } }).slider("slide");
$("sliderSelector").slider({ slide: function(){ ... } }).trigger("slide");

Я знаю, что мог бы использовать именованную функцию вместо анонимной, но я не считаю это решением, потому что я могу вызывать функцию с любыми аргументами, которые я хочу при вызове события slide, чтобы получить правильные значения, установленные ползунок.

Ответы [ 2 ]

9 голосов
/ 24 мая 2011

Решение

Это результирующий код, который фактически запускает такой обработчик событий:

var s = $("sliderSelector").slider({ slide: function(evt, ui){ ... } });
s.slider("option", "slide").call(s, null, { values: s.slider("values") });

Убедитесь, что вы предоставили те параметры функции, которые вы фактически используете в своем обработчике событий.В моем случае, когда я использую ползунок диапазона, мне нужен параметр ui.values, поэтому я создаю такой объект, чтобы мой обработчик не сломался.

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

2 голосов
/ 20 июля 2011

У меня только что была очень похожая проблема.

Если вы зарегистрируете свои обратные вызовы с помощью .bind() (или .on для более поздних версий jQuery) вместо того, чтобы помещать их в инициализатор, вы можете затем вызывать их, как ожидается, с помощью .trigger().

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

...