如何在JavaScript中触发个人事件

10

我无法在IE中使用JavaScript触发个人事件。在Firefox中运行得很好。

我的代码是:

var evento; 
if(document.createEventObject)  
{  
   evento = document.createEventObject();  
   document.fireEvent('eventoPersonal', evento);     
}  
//FF  
else  
{  
    evento = document.createEvent('Events');  
    evento.initEvent('eventoPersonal',true,false);  
    document.dispatchEvent(evento);  
}

但是在IE中尝试执行document.fireEvent('eventoPersonal', evento);时,它不起作用。我该如何在IE中触发非自定义事件?

在Internet Explorer中,我在执行document.fireEvent('eventoPersonal', evento);的那一行中得到错误:"无效参数"。


很好。在IE中,“不工作”是什么意思?你是否收到错误提示?还是什么都没有发生,但没有错误提示? - JPot
谢谢,但我不知道为什么会忘记“NO”,因为我真的是在问:“如何在Internet Explorer中触发NO自定义事件?” - matias albala
6个回答

39

Dean Edward's描述了如何在IE中触发自定义事件。

http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/

这篇文章的最后部分有相关内容。

var currentHandler;

if (document.addEventListener) {

  // We've seen this code already

} else if (document.attachEvent) { // MSIE

  document.documentElement.fakeEvents = 0; // an expando property

  document.documentElement.attachEvent("onpropertychange", function(event) {
    if (event.propertyName == "fakeEvents") {
      // execute the callback
      currentHandler();
    }
  });

  dispatchFakeEvent = function(handler) {
    // fire the propertychange event
    document.documentElement.fakeEvents++;
  };
}

2
+1 这正是他所询问的内容,虽然从技术上讲这只是一个解决方法,但它确实是原帖作者所要求的。 (很好的发现!) - cgp
非常好的答案,我实际上正在查看原型以了解他们是如何做到的(请参见下面的答案),但这是一个很好的例子和文章!+50声望奖励(当SO让我时,说3个小时...):D - Jason
仅供记录,document.documentElement.fakeEvents++不会在IE9上触发onpropertychange事件,必须使用document.documentElement.setAttribute("fakeEvent", document.documentElement.fakeEvents++)。 - Ziul

2
我认为答案是 - 在IE中,您不能触发不在此列表中的事件:

{{link1:MSDN - DHTML事件}}

据我所知,框架存储“自定义”事件名称的注册表,您必须使用它们的实现特定的触发器处理器函数来处理自定义事件。例如,原型使用ondatavailable事件在幕后传递其自定义事件。

1

在IE11中,document.dispatchEvent仍然无法使用,但现在连attachEvent也不见了,所以另一种解决方案也行不通。然而,我想到了一个更加丑陋的解决方法。 :) 它涉及替换addEventListener方法,具体如下:

var oldEventListener = document.addEventListener;

document.addEventListener = function (event, func, capture) {
    if (event == "MyPreciousCustomEvent") {
        document.MyPreciousCustomEvent = func;
    }

    oldEventListener.call(document, event, func, capture);
};

...

$(function () {
    try {
        document.MyPreciousCustomEvent("MyPreciousCustomEvent", {});
    } catch (e) {}
});

希望这能帮助到某人。

0
阅读有关createEventObject方法的相关MSDN文章页面时,我发现它似乎并不用于创建自定义事件 - 它用于创建可传递给已存在事件的自定义对象。 描述: 生成一个event对象,以在使用fireEvent方法时传递事件上下文信息。

http://msdn.microsoft.com/en-us/library/ms536390%28VS.85%29.aspx

更新:您收到“无效参数”错误是因为“eventoPersonal”不是可触发的事件。


1
谢谢,但我不知道为什么会忘记“NO”,因为我真的在问“如何在Internet Explorer中触发NO自定义事件?” - matias albala

0

你可能想考虑使用一个库来抽象这个过程。Prototype和jQuery都可以为你处理这个问题。jQuery尤其擅长让你用非常简单的代码创建事件。

jQuery的文档在这里: http://docs.jquery.com/Events


11
是的,但是这些框架在IE中如何实现自定义事件名称呢? - Jason

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接