如何手动触发onchange事件?

Cod*_*tie 372 javascript event-handling javascript-events

我正在通过日历小部件设置日期时间文本字段值.显然,日历小部件的功能如下:

document.getElementById('datetimetext').value = date_value;
Run Code Online (Sandbox Code Playgroud)

我想要的是:在更改日期时间文本字段中的值时,我需要重置页面中的其他一些字段.我已经在datetimetext字段中添加了一个onchange事件监听器,该字段没有被触发,因为我猜想onchange只有当元素获得焦点并且在失去焦点时其值被更改时才会触发.

因此,我正在寻找一种手动触发此onchange事件的方法(我想应该注意检查文本字段中的值差异).

有任何想法吗 ?

And*_*y E 441

有几种方法可以做到这一点.如果onchange侦听器是通过element.onchange属性设置的函数,并且您不会对事件对象或冒泡/传播感到困扰,那么最简单的方法就是调用该函数:

element.onchange();
Run Code Online (Sandbox Code Playgroud)

如果您需要它来完整地模拟真实事件,或者如果您通过html属性或addEventListener/ 设置事件attachEvent,则需要进行一些功能检测以正确触发事件:

if ("createEvent" in document) {
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("change", false, true);
    element.dispatchEvent(evt);
}
else
    element.fireEvent("onchange");
Run Code Online (Sandbox Code Playgroud)

  • Andy E,这在IE10中不起作用,任何想法? (2认同)
  • 这就是“老办法”。现在有[另一种方式](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events#Creating_custom_events)。参见米兰的回答。 (2认同)

Mil*_*iev 309

MDN建议在现代浏览器中使用更简洁的方法:

// Assuming we're listening for e.g. a 'change' event on `element`

// Create a new 'change' event
var event = new Event('change');

// Dispatch it.
element.dispatchEvent(event);
Run Code Online (Sandbox Code Playgroud)

  • @BrettZamir通过以下方式为我(至少在Chrome 36中)工作:`document.querySelector('select.freight').dispatchEvent(new Event('change',{'bubbles':true}))` (40认同)
  • 这不适用于IE11 (9认同)
  • 仅仅注意这个... MDN确实提到了这一点,但它不受IE10 +支持(可以说是现代的定义现代...)并且只在Safari的夜间(作为写作时间)IE10 +确实有这个构造方法但是你需要指定事件的类型,例如.MouseEvent或KeyboardEvent:请参阅: - https://msdn.microsoft.com/en-us/library/ie/dn905219%28v=vs.85%29.aspx (7认同)
  • 现在是“new CustomEvent('change')”(2020 年 6 月/Covid-19)。 (4认同)
  • `element.dispatchEvent(new window.Event('change', { bubbles: true }))` 如果你也想冒泡 (2认同)

Jac*_*uka 13

对于那些使用jQuery的人来说,有一个方便的方法:http://api.jquery.com/change/

  • 这种"方便的方法"不会触发本机更改事件,只触发自己的更改事件.如果在没有jQuery的情况下绑定事件然后使用jQuery触发它,则绑定的回调将不会运行. (55认同)
  • 感谢您的评论 - 我刚刚遇到了这个陷阱! (7认同)
  • $ .trigger('change')似乎也是如此.尽管jQuery的文档声明它触发了本机事件,但它与dispatchEvent()的作用不同. (5认同)