How do you force your Javascript event to run first, regardless of the order in which the events were added?

前端 未结 5 1387
庸人自扰
庸人自扰 2020-12-05 23:33

I have Javascript that people are including in their page. In my Javascript I have a version of jQuery (1.8 for sake of easy reference) that is sectioned off into its own n

5条回答
  •  悲&欢浪女
    2020-12-06 00:30

    Just so it's said, I think this might be possible if you override the native implementations of these functions. This is BAD practice - very bad practice when developing a library to alter native implementations, because it can easily conflict with other libraries.

    However, for completeness, here's one possibility (completely untested, just demonstrating the general concept):

    // override createElement()
    var temp = document.createElement;
    document.createElement = function() {
        // create element
        var el = document.createElement.original.apply(document, arguments);
    
        // override addEventListener()
        el.addEventListenerOriginal = el.addEventListener;
        el._my_stored_events = [];
    
        // add custom functions
        el.addEventListener = addEventListenerCustom;
        el.addEventListenerFirst = addEventListenerFirst;
        // ...
    };
    document.createElement.original = temp;
    
    // define main event listeners
    function myMainEventListeners(type) {
        if (myMainEventListeners.all[type] === undefined) {
            myMainEventListeners.all[type] = function() {
                for (var i = 0; i < this._my_stored_events.length; i++) {
                    var event = this._my_stored_events[i];
                    if (event.type == type) {
                        event.listener.apply(this, arguments);
                    }
                }
            }
        }
        return myMainEventListeners.all[type];
    }
    myMainEventListeners.all = {};
    
    // define functions to mess with the event list
    function addEventListenerCustom(type, listener, useCapture, wantsUntrusted) {
        // register handler in personal storage list
        this._my_stored_events.push({
            'type' : type,
            'listener' : listener
        });
    
        // register custom event handler
        if (this.type === undefined) {
            this.type = myMainEventListeners(type);
        }
    }
    
    function addEventListenerFirst(type, listener) {
        // register handler in personal storage list
        this._my_stored_events.push({
            'type' : type,
            'listener' : listener
        });
    
        // register custom event handler
        if (this.type === undefined) {
            this.type = myMainEventListeners(type);
        }
    }
    
    // ...
    

    A lot more work would need to be done in this regard to truly lock this down, and again, it's best not to modify native libraries. But it's a useful mental exercise that helps to demonstrate the flexibility JavaScript provides in solving problems like this.

提交回复
热议问题