【问题标题】:How to Fire Personal Event in Javascript如何在 Javascript 中触发个人事件
【发布时间】:2010-01-08 15:12:56
【问题描述】:

我无法在 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 custom 事件?

在 Internet Explorer 中,我收到错误:“无效参数”在执行 document.fireEvent('eventoPersonal', evento); 的行中

【问题讨论】:

  • 酷。你在 IE 中“不工作”是什么意思?你有错误吗?什么都没有发生但没有错误?
  • 谢谢,但我不知道为什么我忘记了“NO”,因为我真的很想“如何在 Internet Explorer 中触发 NO 自定义事件?”。

标签: javascript javascript-events


【解决方案1】:

Dean Edward 的描述如何在 IE 中触发 cutsom 事件

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 这正是他要问的问题,尽管从技术上讲这是一种解决方法,但这正是原始发帖人所要求的。 (很好的发现!)
  • 很好的答案,我实际上是在看原型,看看他们是如何做到的(见下面的答案),但这是一个很好的例子和文章! +50 代表奖励(当我允许时,说 3 小时......):D
  • 仅作记录,document.documentElement.fakeEvents++;在 IE9 上不会触发 onpropertychange 事件,它必须是 document.documentElement.setAttribute("fakeEvent", document.documentElement.fakeEvents++);
【解决方案2】:

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

MSDN - DHTML Events

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

【讨论】:

    【解决方案3】:

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

    Jquery 的文档可以在这里找到: http://docs.jquery.com/Events

    【讨论】:

    • 是的,但是这些框架如何在 IE 中实现自定义事件名称?
    【解决方案4】:

    在 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) {}
    });
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案5】:

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

      说明: 当您使用fireEvent 方法时,生成一个event 对象以传递事件上下文信息。

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

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

      【讨论】:

      • 谢谢,但我不知道为什么我忘记了“NO”,因为我真的很想知道“如何在 Internet Explorer 中触发 NO 自定义事件?”
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2020-11-21
        • 2012-06-23
        • 2013-09-16
        • 2012-11-06
        相关资源
        最近更新 更多