0

我正在构建一个自定义的自动填充小部件,我需要重写默认的“选择”行为并让它在任何外部附加的事件处理程序之前运行。为什么在配置的“select”处理程序之前调用“autocompleteselect”处理程序?

$("#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 

我的问题是,为什么呢?这背后有一些理由吗?在我看来,在给予autocomplete()“构造函数”的settings/config对象中配置的事件处理程序应该首先发生,而使用bind()附加的处理程序应该在之后发生。

我意识到我可以在我的插件中使用bind()来确保我的事件处理程序是第一次运行,但它为代码添加了一些混乱。

+0

“为什么”这种方式可能只能由jQueryUI团队成员负责...... – 2011-04-28 02:12:58

回答

0

这是因为在幕后它使用Widget对象的_trigger函数。

查看下面的代码摘录,您将看到在正常事件触发器(this.element.trigger)之后调用callBack(选项参数中的函数)。

_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()); 
} 

最佳方面,
斯特凡。

相关问题