小编典典

如何订购与jQuery绑定的事件

javascript

可以说我有一个Web应用程序,该应用程序的页面可能包含4个脚本块-我编写的脚本可能在其中一个块中找到,但我不知道哪个是由控制器处理的。

我将一些onclick事件绑定到按钮,但是我发现它们有时会按我不期望的顺序执行。

有没有办法确保订单,或者您过去如何处理此问题?


阅读 263

收藏
2020-04-25

共1个答案

小编典典

我花了很长时间来概括这种过程,但就我而言,我只关心链中第一个事件侦听器的顺序。

如果有什么用,这里是我的jQuery插件,它绑定一个始终在任何其他事件之前触发的事件侦听器:

更新内联jQuery更改(感谢Toskan)

(function($) {
    $.fn.bindFirst = function(/*String*/ eventType, /*[Object])*/ eventData, /*Function*/ handler) {
        var indexOfDot = eventType.indexOf(".");
        var eventNameSpace = indexOfDot > 0 ? eventType.substring(indexOfDot) : "";

        eventType = indexOfDot > 0 ? eventType.substring(0, indexOfDot) : eventType;
        handler = handler == undefined ? eventData : handler;
        eventData = typeof eventData == "function" ? {} : eventData;

        return this.each(function() {
            var $this = $(this);
            var currentAttrListener = this["on" + eventType];

            if (currentAttrListener) {
                $this.bind(eventType, function(e) {
                    return currentAttrListener(e.originalEvent); 
                });

                this["on" + eventType] = null;
            }

            $this.bind(eventType + eventNameSpace, eventData, handler);

            var allEvents = $this.data("events") || $._data($this[0], "events");
            var typeEvents = allEvents[eventType];
            var newEvent = typeEvents.pop();
            typeEvents.unshift(newEvent);
        });
    };
})(jQuery);

注意事项:

  • 尚未经过充分测试。
  • 它依赖于jQuery框架的内部结构不变(仅在1.5.2下进行了测试)。
  • 它不一定会在以其他方式绑定的事件侦听器之前触发,而不是作为源元素的属性或使用jQuery bind()和其他关联函数进行绑定。
2020-04-25