如何以编程方式对输入强制执行 onchange 事件?

IT技术 javascript
2021-01-29 02:19:57

如何以编程方式对输入强制执行 onchange 事件?

我试过这样的事情:

var code = ele.getAttribute('onchange');
eval(code);

但我的最终目标是触发任何侦听器函数,这似乎不起作用。也不只是更新“值”属性。

6个回答

创建一个Event对象并将其传递给dispatchEvent元素方法:

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

这将触发事件侦听器,无论它们是通过调用addEventListener方法还是通过设置onchange元素属性来注册的。


如果希望事件冒泡,则需要向Event构造函数传递第二个参数

var event = new Event('change', { bubbles: true });

有关浏览器兼容性的信息:

这是如何正确地做到这一点,本机。现在所有浏览器都支持:caniuse.com/#feat=dispatchevent
2021-03-24 02:19:57
这是这个问题真实答案。我们必须以现代方式实现这一目标。
2021-03-24 02:19:57
为什么每个人都说这是最好的答案?根据链接的事件文档,即使是当前版本的 IE仍然不支持这一点。
2021-03-24 02:19:57
是的,MDN 创建和触发事件是一个很好的资源!
2021-03-27 02:19:57
我试图在 IE11 上做同样的事情,但在尝试更改 reactjs 输入字段时它不起作用。 var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
2021-04-07 02:19:57

在 jQuery 中,我主要使用:

$("#element").trigger("change");
请注意,这不会触发本机 onchange。它只会触发所有通过 jQuery 绑定的 onchange 侦听器!
2021-03-15 02:19:57
作为更新, $("#element").change(); 自 jquery 1.0 起做同样的事情。
2021-03-20 02:19:57
这对我有帮助!我正在使用代码设置复选框的值(选中或不选中),无论我做什么,事件都没有在 IE 中触发。我尝试了 blur() focus() 和其他一些东西。在我设置了我称之为触发器的值之后,我还添加了一个点击事件来调用触发器。它会引起多次火灾,但对我来说并不重要。在 IE 中,我通过代码添加复选框,您必须在更改事件触发之前单击它们两次。谢谢你的提示。
2021-03-21 02:19:57

不要对任何东西使用 eval 嗯,有一些东西,但它们非常罕见。相反,你会这样做:

document.getElementById("test").onchange()

在这里查看更多选项:http : //jehiah.cz/archive/firing-javascript-events-properly

json2.js 用于对象化 JSON!JSON.parse 已经在现代浏览器上可用
2021-03-24 02:19:57
这个答案已过时如果您曾经Element.addEventListener处理事件,则上面的代码将不起作用要以现代方式实现它,请参阅@Miscreant 的答案。
2021-03-27 02:19:57
此技术在通过设置“onchange”附加更改处理程序时才有效。它不会生成触发 w3c 或 microsoft 事件处理程序的“真实”事件。请参阅链接查看更多细节。
2021-04-02 02:19:57
我觉得现在这个答案已经过时,恶棍的答案使用new Event(...),并dispatchEvent是时下正确的解决方案,它似乎。
2021-04-04 02:19:57
用于对象化 JSON 的 eval ;)
2021-04-09 02:19:57

出于某种原因,ele.onchange() 在我的页面上的 IE 中为我抛出了一个“找不到方法”的异常,所以我最终使用了Kolten提供的链接中的这个函数并调用了 fireEvent(ele, 'change'),它起作用了:

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

但是,我确实创建了一个测试页面,确认调用应该 onchange() 工作:

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

编辑: ele.onchange() 不起作用的原因是因为我实际上没有为 onchange 事件声明任何内容。但是 fireEvent 仍然有效。

我比我提供的示例更喜欢这种浏览器检测方法(通过对象检测)。
2021-03-24 02:19:57
这不再适用于 Firefox 23:“element.dispatchEvent is not a function”
2021-03-27 02:19:57
嗨,谷歌员工。现在是 2016 年!现在我们写代码一样element.dispatchEvent(new Event('change', true, true)),而不是所有的晦涩难懂,大多是过时createEventinitEvent东西。
2021-04-03 02:19:57

取自QUnit底部

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

当然,您可以将 $.browser 内容替换为您自己的浏览器检测方法,以使其独立于 jQuery。

要使用此功能:

var event;
triggerEvent(ele, "change", event);

这基本上会触发真正的 DOM 事件,就好像某些事情真的发生了变化。