当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何以编程方式强制输入onchange事件?》经验,为你挑选了4个好方法。

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

我尝试过这样的事情:

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

但我的最终目标是触发任何侦听器功能,这似乎不起作用.也不仅仅是更新'value'属性.



1> Miscreant..:

创建一个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 });

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

dispatchEvent()

事件()


为什么每个人都说这是最好的答案?根据链接的事件文档,即使IE * still *的当前版本也不支持此功能。
是的,[MDN创建和触发事件](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events)是一个很好的资源!
这个答案需要得到提升才能达到顶峰.

2> Danita..:

在jQuery中我主要使用:

$("#element").trigger("change");


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

3> Kolten..:

呃不要用eval做任何事情.嗯,有一些事情,但它们非常罕见.相反,你会这样做:

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

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


如果通过设置"onchange"附加了更改处理程序,则此技术*仅*有效.它不会生成触发w3c或microsoft事件处理程序的"真实"事件.请参阅链接查看更多细节.
我认为这个答案现在已经过时了,[Miscreant的答案](http://stackoverflow.com/a/36648958/204205)使用`new Event(...)`和`dispatchEvent`是现在正确的解决方案.
用于客观化JSON的eval;)
**这个答案已经过时了**; 如果使用`Element.addEventListener`来处理事件,上面的代码将不起作用.要以现代的方式实现它,请参阅@ Miscreant的答案.
json2.js用于客观化JSON!JSON.parse已经可以在现代浏览器上使用

4> Soldarnal..:

由于某种原因,ele.onchange()在我的页面上为我在IE中抛出了一个"找不到方法"的expception,所以我最终使用了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()工作:



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


嗨,Google员工.这是2016年!现在我们编写的代码就像`element.dispatchEvent(new Event('change',true,true))`而不是所有那些神秘的,大部分都弃用了`createEvent`和`initEvent`的东西.
我喜欢这种浏览器检测方法(通过对象检测)比我提供的示例更好.
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有