Attaching jQuery event handlers so that they are triggered first

前端 未结 9 1841
太阳男子
太阳男子 2020-12-05 09:36

Is there a way to attach a jQuery event handler such that the handler is triggered before any previously-attached event handlers? I came across this article, but the code d

9条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-05 10:23

    Here's a combination of some prior methods including support for handlers, namespacing, non-jquery bindings, and once support:

    $.fn.oneFirst = function(event_type, event_callback, handler) {
        return this.bindFirst(event_type, event_callback, handler, "one");
    },
    $.fn.bindFirst = function(event_type, event_callback, handler, bind_type) {
        var event_types = event_type.split(/\s+/);
        var pos;
        handler = (handler == undefined ? event_callback : handler);
        event_callback = (typeof event_callback == "function" ? {} : event_callback);
    
        this.each(function() {
            var $this = $(this);
            for (var i in event_types) { // each bound type
                event_type = event_types[i];
    
                var event_namespace = ((pos = event_type.indexOf(".")) > 0 ? event_type.substring(pos) : "");
                event_type = (pos > 0 ? event_type.substring(0, pos) : event_type);
                var current_attr_listener = this["on" + event_type];
    
                if (current_attr_listener) { // support non-jquery binded events
                    $this.bind(event_type, function(e) {
                        return current_attr_listener(e.originalEvent);
                    });
                    this["on" + event_type] = null;
                }
    
                if (bind_type == "one") {
                    $this.one(event_type + event_namespace, event_callback, handler);
                }
                else {
                    $this.bind(event_type + event_namespace, event_callback, handler);
                }
    
                var all_events = $.data(this, 'events') || $._data(this).events;
                var type_events = all_events[event_type];
                var new_event = type_events.pop();
                type_events.unshift(new_event);
            }
        });
    };
    

提交回复
热议问题