如何以编程方式强制input上的onchange事件?

如何以编程方式强制input上的onchange事件?

我试过这样的事情:

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

但是我的最终目标是解雇任何听众的function,而这似乎并不奏效。 也不只是更新“值”属性。

呃不要使用评估任何东西 。 那么,有一些东西,但它们是非常罕见的。 相反,你会这样做:

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

在这里寻找更多的select: http : //jehiah.cz/archive/firing-javascript-events-properly

在jQuery中我主要使用:

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

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

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

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


如果您希望事件冒泡,则将第二个parameter passing给Event构造函数:

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

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

  • dispatchEvent()
  • 事件()

由于某种原因,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()工作的testing页面:

 <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仍然有效。

从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的东西replace为您自己的浏览器检测方法,使其独立于jQuery。

要使用这个function:

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

这将基本上激发真正的DOM事件,就好像事情已经发生了变化。

使用JQuery,你可以做到以下几点:

 // for the element which uses ID $("#id").trigger("change"); // for the element which uses class name $(".class_name").trigger("change"); 

如果您使用jQuery,您将拥有:

 $('#elementId').change(function() { alert('Do Stuff'); }); 

或MS AJAX:

 $addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); }); 

或者在元素的原始HTML中:

 <input type="text" onchange="alert('Do Stuff');" id="myElement" /> 

重读这个问题之后,我想我想念一下要做的事情。 我从来没有find一种更新DOM元素的方式来强制更改事件,你最好做的是有一个单独的事件处理方法,像这样:

 $addHandler($get('elementId'), 'change', elementChanged); function elementChanged(){ alert('Do Stuff!'); } function editElement(){ var el = $get('elementId'); el.value = 'something new'; elementChanged(); } 

既然你已经写了一个JavaScript方法,将会改变它只有一个额外的线路来调用。

或者,如果您使用Microsoft AJAX框架,则可以通过以下方式访问所有事件处理程序:

 $get('elementId')._events 

它可以让你做一些reflection式的工作,find正确的事件处理程序来触发。