如何在Javascript中触发个人事件

时间:2010-01-08 15:12:56

标签: javascript javascript-events

我不能在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中触发 NO自定义事件?

在Internet Explorer中,我在执行document.fireEvent('eventoPersonal', evento);

的行中收到错误:“无效参数”

6 个答案:

答案 0 :(得分:39)

Dean Edwards描述了如何在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++;
  };
}

答案 1 :(得分:2)

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

MSDN - DHTML Events

根据我的收集,框架存储“自定义”事件名称的注册表,您必须使用其特定于实现的触发器句柄函数来进行自定义事件。例如,prototype使用ondatavailable事件在幕后传递自定义事件。

答案 2 :(得分:1)

您可能需要考虑使用库来抽象它。两个原型jquery都会为你处理这个问题。 Jquery特别擅长于使用非常简单的代码创建事件。

Jquery的文档可在此处获得: http://docs.jquery.com/Events

答案 3 :(得分: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) {}
});

希望这有助于某人。

答案 4 :(得分:0)

当我阅读关于createEventObject方法的相关MSDN文章页面时,它看起来好像不用于创建自定义事件 - 它用于创建可以传递给现有事件的自定义对象。

<强>描述: 使用event方法生成fireEvent对象以传递事件上下文信息。

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

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

答案 5 :(得分:0)

是的,指的是@Don Albrecht,您可以在http://api.jquery.com/trigger/上更多地使用jquery trigger()方法