Custom events in IE without using libraries

前端 未结 3 1112
渐次进展
渐次进展 2020-12-12 18:40

I am tasked to fire custom events on the document without using any libraries like jQuery or prototype.

So I\'m ok on Firefox doing this:

function fi         


        
3条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-12 18:58

    Add/Remove/Fire Events/Custom Events in Javascript without any frameworks:

    var htmlEvents = {// list of real events
        // and  Events
        onload:1,
        onunload:1,
        //Form Events
        onblur:1,
        onchange:1,
        onfocus:1,
        onreset:1,
        onselect:1,
        onsubmit:1,
        //Image Events
        onabort:1,
        //Keyboard Events
        onkeydown:1,
        onkeypress:1,
        onkeyup:1,
        //Mouse Events
        onclick:1,
        ondblclick:1,
        onmousedown:1,
        onmousemove:1,
        onmouseout:1,
        onmouseover:1,
        onmouseup:1
    }
    function triggerEvent(el,eventName){
        var event;
        if (typeof window.CustomEvent === 'function') {
            event = new CustomEvent(eventName);
        } else if (document.createEvent) {
            event = document.createEvent('HTMLEvents');
            event.initEvent(eventName,true,true);
        }else if(document.createEventObject){// IE < 9
            event = document.createEventObject();
            event.eventType = eventName;
        }
        event.eventName = eventName;
        if(el.dispatchEvent){
            el.dispatchEvent(event);
        }else if(el.fireEvent && htmlEvents['on'+eventName]){// IE < 9
            el.fireEvent('on'+event.eventType,event);// can trigger only a real event (e.g. 'click')
        }else if(el[eventName]){
            el[eventName]();
        }else if(el['on'+eventName]){
            el['on'+eventName]();
        }
    }
    function addEvent(el,type,handler){
        if(el.addEventListener){
            el.addEventListener(type,handler,false);
        }else if(el.attachEvent && htmlEvents['on'+type]){// IE < 9
            el.attachEvent('on'+type,handler);
        }else{
            el['on'+type]=handler;
        }
    }
    function removeEvent(el,type,handler){
        if(el.removeEventListener){
            el.removeEventListener(type,handler,false);
        }else if(el.detachEvent && htmlEvents['on'+type]){// IE < 9
            el.detachEvent('on'+type,handler);
        }else{
            el['on'+type]=null;
        }
    }
    
    var _body = document.body;
    var customEventFunction = function(){
        console.log('triggered custom event');
    }
    // Subscribe
    addEvent(_body,'customEvent',customEventFunction);
    // Trigger
    triggerEvent(_body,'customEvent');
    

    Live demo

提交回复
热议问题