Почему $("#slider"). Trigger("slide") не приводит к вызову обработчика слайдов?

У меня есть слайдер jQuery (собственно, его собственное расширение), снабженный обработчиком для slide событие, и этот обработчик вызывается должным образом, когда слайдер управляется в интерактивном режиме, но не когда я запускаю

$("#slider").trigger("slide");

Эта команда выполняется без ошибок, но slide обработчик не вызывается.

Почему это?

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

РЕДАКТИРОВАТЬ: изменил заголовок сообщения, чтобы более точно отразить мотивацию вопроса.

3 ответа

Рабочая демонстрация: http://jsfiddle.net/fLnmN/ или http://jsfiddle.net/F5ZCK/

использование .bind как я использовал в демо. ты можешь использовать .on а также вот так: http://jsfiddle.net/u82Y5/

Вот несколько действительно полезных постов: запуск события слайдера jQuery UI

Это должно соответствовать вашим потребностям, :)

код

$('.slider').slider().bind({
    change: function() {
       alert('change triggered');
    }
});

$('.slider').trigger('change');

ИЛИ ЖЕ

$('.slider').slider().on({
    change: function() {
       alert('change triggered');
    },
    slidechange: function() {
        alert('slide trigger');
    }
});

$('.slider').trigger('change');
$('.slider').trigger('slidechange');

Причина trigger('slide') не работает, потому что, когда вы установите свой slide При обратном вызове слайдер не регистрирует событие слайда с элементом DOM. Вместо этого он делегирует общие события мыши элементу DOM, а затем внутренне преобразует их в ваши обратные вызовы.

К сожалению, это оставляет вас работать вокруг этого API. Ответ Tats_innit связывает события непосредственно с элементом DOM, но они не связаны с API-интерфейсом слайдера. Вам придется вызывать вашу функцию обратного вызова в этих функциях-обработчиках.

Если у вас есть доступные обратные вызовы, вы можете позвонить им напрямую, как указано ниже:

$('#slider').slider({
  'slide': onSlide
}).on('slide', onSlide);

Если вы предпочитаете определять функции обратного вызова встроенными, вы можете получить их следующим образом:

$('#slider').slider({
  'slide': function(event, ui) { /* ... */ },
}).on('slide', function() {
  $(this).slider('option', 'slide').apply(this, arguments);
});

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

Обратите внимание, что инициирующие события по отдельности пропускают другие события, которые будут вызываться последовательно, когда они исходят от пользователя. Например, запуск stop событие пропустит slide событие, которое пользователь будет генерировать при настройке ползунка. Вы можете рассмотреть возможность "оправдания" привязки внешнего события, создав пользовательское событие, которое отправляет несколько событий от вашего имени (например, $('#slider').trigger('setvalue')).

Можно вызвать обратный вызов слайда напрямую, но вы должны передать событие (или нуль) и объект со значением, если он используется внутри обратного вызова:

var $slider = $("#slider");
$slider.slider('option', 'slide').call($slider, null, {value:1});
Другие вопросы по тегам