javascript - 不使用库的 IE 中的自定义事件

标签 javascript internet-explorer events

我的任务是在不使用 jQuery 或原型(prototype)等任何库的情况下触发文档上的自定义事件。

所以我同意 Firefox 这样做:

function fireCustomEvent(eventData)
{
    if (document.createEvent)   // Firefox
    {
        var event = document.createEvent('HTMLEvents');    // create event
        event.initEvent('myCustomEvent', true, true );     // name event
        event.data = eventData;                            // put my stuff on it
        document.dispatchEvent(event);                     // fire event
    }
    else if (document.createEventObject)    // IE
    {
        xxxxxxxxxxx
    }
}

现在我可以像这样触发它:

fireCustomEvent({
    category: 'test',
    value: 123
});

然后像这样捕获它(这里我可以使用 jQuery):

$(document).bind('myCustomEvent', function (event) {
    doStuff(event);
});

我的问题是,我该怎么做才能使其在 IE 上工作(换句话说,我把 xxxxxxxxxx 放在哪里)?

我认为 IE 等效项应该如下所示:

 var event = document.createEventObject();
 event.data = eventData;
 document.fireEvent('myCustomEvent', event);

但这行不通。 IE 允许我仅使用预定义的事件名称(onclick 等),甚至其中一些不起作用(例如 onmessage)

感谢任何帮助或想法!

最佳答案

在没有任何框架的情况下使用 Javascript 添加/删除/触发事件/自定义事件:

var htmlEvents = {// list of real events
    //<body> and <frameset> 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

关于javascript - 不使用库的 IE 中的自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342917/

相关文章:

javascript - 如何使用JQuery重定向到另一个子页面

javascript - 从嵌套的 html 列表生成多维数组/对象

internet-explorer - 如何在 IE7 及更早版本中将子元素定位在其父元素之后

c# - 从另一个事件中引发一个事件是不是很臭?

javascript - 新的日期()格式

javascript - 如何判断我是否点击了标签<p>中的内容?

html - 如何使用 IE 在 Selenium RC 上使用 HTML TestSuite 和测试用例

jquery setInterval ie9 不触发

javascript - 阻止 jQuery 调用下一个事件

javascript - 将大写特殊字符转换为小写特殊字符的最简单方法是什么?