我正在通过日历小部件设置日期时间文本字段值。显然,日历小部件是这样做的:

document.getElementById('datetimetext').value = date_value;

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

因此,我正在寻找一种方法来手动触发这个onchange事件(我猜应该负责检查文本字段中的值差异)。

什么好主意吗?


当前回答

有几种方法可以做到。如果onchange监听器是通过元素设置的函数。Onchange属性,你不用担心事件对象或冒泡/传播,最简单的方法是调用该函数:

element.onchange();

如果你需要它完全模拟真实事件,或者如果你通过HTML属性或addEventListener/attachEvent设置事件,你需要做一些功能检测来正确触发事件:

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

其他回答

有几种方法可以做到。如果onchange监听器是通过元素设置的函数。Onchange属性,你不用担心事件对象或冒泡/传播,最简单的方法是调用该函数:

element.onchange();

如果你需要它完全模拟真实事件,或者如果你通过HTML属性或addEventListener/attachEvent设置事件,你需要做一些功能检测来正确触发事件:

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

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);