Answers:
创建一个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 });
有关浏览器兼容性的信息:
var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
在jQuery中,我主要使用:
$("#element").trigger("change");
呃不要用eval做任何事情。好吧,有某些事情,但它们极为罕见。相反,您可以这样做:
document.getElementById("test").onchange()
在此处查找更多选项:http : //jehiah.cz/archive/firing-javascript-events-properly
Element.addEventListener以前用于处理事件,则上面的代码将不起作用。要以现代方式实现它,请参阅@Miscreant的答案。
出于某种原因,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仍然有效。
element.dispatchEvent(new Event('change', true, true)),而不是所有的晦涩难懂,大多是过时createEvent和initEvent东西。
取自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事件,就好像实际已发生更改一样。
如果使用此代码段添加所有事件,请执行以下操作:
//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
if(!this.events)this.events = {};
if(!this.events[event]){
this.events[event] = [];
var element = this;
this['on'+event] = function(e){
var events = element.events[event];
for(var i=0;i<events.length;i++){
events[i](e||event);
}
}
}
this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});
那么您可以只使用element.on<EVENTNAME>()where <EVENTNAME>是您的事件的名称,这将使用<EVENTNAME>
用于触发Javascript中的任何事件。
document.getElementById("yourid").addEventListener("change", function({
//your code here
})
如果您使用的是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" />
重新阅读了问题之后,我想我错过了应做的事情。我从未找到过以强制更改事件的方式更新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
它允许您执行一些反射样式的工作,以找到要触发的正确事件处理程序。