如何在 JavaScript 中触发事件?

IT技术 javascript events triggers addeventlistener dom-events
2021-01-11 20:01:36

我已使用addEventListener. 它工作正常。当我想从另一个函数以编程方式触发事件时,我的问题就出现了。

我该怎么做?

6个回答

注意:initEvent方法现已弃用。其他答案具有最新和推荐的做法。


您可以IE 8或更低版本使用fireEvent大多数其他浏览器上使用W3C 的dispatchEvent要创建要触发的事件,您可以使用取决于浏览器。createEventcreateEventObject

这是一段不言自明的代码(来自原型),它dataavailable在 上触发事件element

var event; // The custom event that will be created
if(document.createEvent){
    event = document.createEvent("HTMLEvents");
    event.initEvent("dataavailable", true, true);
    event.eventName = "dataavailable";
    element.dispatchEvent(event);
} else {
    event = document.createEventObject();
    event.eventName = "dataavailable";
    event.eventType = "dataavailable";
    element.fireEvent("on" + event.eventType, event);
}
变量eventName在这里包含什么?
2021-03-23 20:01:36
是的 dataavailable 应该在 eventName 中,并且 memo 也应该定义(定义为 {} 是可以的)。
2021-03-24 20:01:36
这个例子甚至不起作用,见我的回答:stackoverflow.com/a/20548330/407213
2021-03-27 20:01:36
Internet Explorer 9+ 处理 createEvent 和 dispatchEvent,因此不需要那些 if 语句。
2021-03-29 20:01:36
不要忘记只有 IE 版本的前面有“on”(我一开始错过了)
2021-04-08 20:01:36

一个工作示例:

// Add an event listener
document.addEventListener("name-of-event", function(e) {
  console.log(e.detail); // Prints "Example of an event"
});

// Create the event
var event = new CustomEvent("name-of-event", { "detail": "Example of an event" });

// Dispatch/Trigger/Fire the event
document.dispatchEvent(event);

对于较旧的浏览器polyfill和更复杂的示例,请参阅MDN 文档

见支持表的EventTarget.dispatchEventCustomEvent

不适用于任何版本的 IE ( caniuse.com/#feat=customevent )。请参阅我的答案以获取修复。
2021-03-14 20:01:36
请注意未来的读者,detail是 的一个属性Event,因此将您想要在另一端访问的任何数据分配给它并通过 访问event.detail+1
2021-03-24 20:01:36
@AngelPolitis:因为它是在上一个已经被接受之后写的,写问题的人(@KoolKabin)可能没有重新阅读答案
2021-03-25 20:01:36
而且因为它在 2010 年被问到
2021-03-29 20:01:36
这个答案现在更实际了。要添加的一件事:如果应该有一个已知类型的事件(如TransitionEventClipboardEvent等),则可以调用适当的构造函数。
2021-04-08 20:01:36

如果您不想使用 jQuery 并且不是特别关心向后兼容性,只需使用:

let element = document.getElementById(id);
element.dispatchEvent(new Event("change")); // or whatever the event type might be

请参阅此处此处的文档

编辑:根据您的设置,您可能想要添加bubbles: true

let element = document.getElementById(id);
element.dispatchEvent(new Event('change', { 'bubbles': true }));
不错的解决方案,但请注意这不适用于 IE11。然后你应该使用CustomEvent和相应的 polyfill。
2021-03-23 20:01:36
比选定的答案更好
2021-03-31 20:01:36
这应该是公认的答案,因为它不使用诸如 initEvent() 之类的弃用方法
2021-04-03 20:01:36

如果你使用jQuery,你可以简单地做

$('#yourElement').trigger('customEventName', [arg0, arg1, ..., argN]);

并处理它

$('#yourElement').on('customEventName',
   function (objectEvent, [arg0, arg1, ..., argN]){
       alert ("customEventName");
});

其中“[arg0, arg1, ..., argN]”表示这些参数是可选的。

正确的语法是 $('#yourElement').trigger('customEventName', [ arg0, arg1, ..., argN ]); 你忘记了第二个参数的 []
2021-03-18 20:01:36

注意:initCustomEvent方法现已弃用。其他答案具有最新和推荐的做法。


如果您支持 IE9+,则可以使用以下内容。你可能不需要 jQuery 中也包含了相同的概念

function addEventListener(el, eventName, handler) {
  if (el.addEventListener) {
    el.addEventListener(eventName, handler);
  } else {
    el.attachEvent('on' + eventName, function() {
      handler.call(el);
    });
  }
}

function triggerEvent(el, eventName, options) {
  var event;
  if (window.CustomEvent) {
    event = new CustomEvent(eventName, options);
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, options);
  }
  el.dispatchEvent(event);
}

// Add an event listener.
addEventListener(document, 'customChangeEvent', function(e) {
  document.body.innerHTML = e.detail;
});

// Trigger the event.
triggerEvent(document, 'customChangeEvent', {
  detail: 'Display on trigger...'
});


如果您已经在使用 jQuery,这里是上面代码的 jQuery 版本。

$(function() {
  // Add an event listener.
  $(document).on('customChangeEvent', function(e, opts) {
    $('body').html(opts.detail);
  });

  // Trigger the event.
  $(document).trigger('customChangeEvent', {
    detail: 'Display on trigger...'
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

这不适用于任何版本的 IE,因为它window.CustomEvent存在但不能作为构造函数调用:caniuse.com/#search=CustomEvent ;)
2021-03-22 20:01:36