Почему обработчики "autocompleteselect" вызываются до настроенного обработчика "select"? - PullRequest
0 голосов
/ 27 апреля 2011

Я создаю настраиваемый виджет автозаполнения, в котором мне нужно переопределить поведение по умолчанию "select" и запустить его перед любыми внешне подключенными обработчиками событий.

$("#input").autocomplete({
    source: ['A','B','C'],
    select: function() {
        console.log("from config.select");
    }
});
$("#input").bind("autocompleteselect", function(event, ui) {
    console.log("from bind()");
});

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

from bind()
from config.select

Мой вопрос: почему? Есть ли какое-то обоснование за этим? Мне кажется, что обработчик событий, сконфигурированный в объекте settings / config, заданном «конструктору» autocomplete (), должен произойти первым, а потом обработчики, связанные с bind ().

Я понимаю, что могу просто использовать bind () в своем плагине, чтобы убедиться, что мой обработчик событий запускается первым, но он добавляет некоторый беспорядок в код.

1 Ответ

0 голосов
/ 15 июня 2011

Это потому, что за сценой используется функция _trigger объекта Widget.

Извлеките приведенный ниже фрагмент кода, и вы увидите, что callBack (функция в параметре параметров) вызывается после обычного триггера события (this.element.trigger).

_trigger: function( type, event, data ) {
    var callback = this.options[ type ];

    event = $.Event( event );
    event.type = ( type === this.widgetEventPrefix ?
        type :
        this.widgetEventPrefix + type ).toLowerCase();
    data = data || {};

    // copy original event properties over to the new event
    // this would happen if we could call $.event.fix instead of $.Event
    // but we don't have a way to force an event to be fixed multiple times
    if ( event.originalEvent ) {
        for ( var i = $.event.props.length, prop; i; ) {
            prop = $.event.props[ --i ];
            event[ prop ] = event.originalEvent[ prop ];
        }
    }

    this.element.trigger( event, data );

    return !( $.isFunction(callback) &&
        callback.call( this.element[0], event, data ) === false ||
        event.isDefaultPrevented() );
}

С наилучшими пожеланиями,
Stéphane.

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