如何以编程方式强制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正确的事件处理程序来触发。