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

Sol*_*nal 103 javascript

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

我尝试过这样的事情:

var code = ele.getAttribute('onchange');
eval(code);
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*ant 108

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

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);
Run Code Online (Sandbox Code Playgroud)

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


如果您希望事件冒泡,请将第二个参数传递给Event构造函数:

var event = new Event('change', { bubbles: true });
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么每个人都说这是最好的答案?根据链接的事件文档,即使IE * still *的当前版本也不支持此功能。 (3认同)
  • 是的,[MDN创建和触发事件](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events)是一个很好的资源! (2认同)
  • 这是如何正确地做到这一点,本机。现在所有浏览器都支持:http://caniuse.com/#feat=dispatchevent (2认同)
  • 这个答案需要得到提升才能达到顶峰. (2认同)

Dan*_*ita 91

在jQuery中我主要使用:

$("#element").trigger("change");
Run Code Online (Sandbox Code Playgroud)

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

Kol*_*ten 60

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

document.getElementById("test").onchange()
Run Code Online (Sandbox Code Playgroud)

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

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

Sol*_*nal 21

由于某种原因,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 嗨,Google员工.这是2016年!现在我们编写的代码就像`element.dispatchEvent(new Event('change',true,true))`而不是所有那些神秘的,大部分都弃用了`createEvent`和`initEvent`的东西. (4认同)
  • 我喜欢这种浏览器检测方法(通过对象检测)比我提供的示例更好. (2认同)