我有一个输入字段,我想分配一个新值并触发.onchange()事件。我做了以下事情:
document.getElementById("range").value='500';
document.getElementById("range").onchange();
范围是我的输入ID。 我收到以下错误:
Uncaught TypeError: Cannot read property 'target' of undefined
有没有办法定义'目标'? 谢谢
答案 0 :(得分:8)
关于target
的错误是因为事件处理程序中的代码试图读取与change事件关联的target
对象的Event
属性。你可以尝试传入一个虚假事件来欺骗它:
var range= document.getElementById('range');
range.onchange({target: range});
或者,如果可以,请将处理程序代码更改为使用this
而不是event.target
。除非您正在使用委托(从父级捕获子对象的更改事件,对于更改事件很麻烦,因为IE不会“冒泡”它们),更改事件的目标始终是事件处理程序的元素已注册,使event.target
多余。
如果事件处理程序使用Event
的更多属性而不仅仅是target
,则需要伪造更多属性,或者使用“真正的”浏览器界面来调度事件。如果事件侦听器可能正在使用(IE中为addEventListener
或attachEvent
),则这也是必要的,因为它们在直接onchange
属性上不可见。这取决于浏览器(IE fireEvent
,标准dispatchEvent
),不适用于较旧或较为模糊的浏览器。
答案 1 :(得分:6)
尝试使用fireEvent或dispatchEvent(取决于浏览器)来引发事件:
document.getElementById("range").value='500';
if (document.getElementById("range").fireEvent) {
document.getElementById("range").fireEvent("onclick");
} else if (document.getElementById("range").dispatchEvent) {
var clickevent=document.createEvent("MouseEvents");
clickevent.initEvent("click", true, true);
document.getElementById("range").dispatchEvent(clickevent);
}
答案 2 :(得分:3)
通常,您的代码应该可以正常工作。但是,可能还有其他东西会发出问题。
range
ID会在您加载时加载
运行代码(例如,您运行它
的document.ready)。range
?onchange()
功能在做什么(可能是
有帮助发布在这里)?除此之外,我建议使用jQuery(如果可能的话):
$('#range').trigger('change');
或只是
$('#range').change();
但正如我所提到的,你的情况也应该正常:http://jehiah.cz/a/firing-javascript-events-properly
答案 3 :(得分:2)
来自:http://www.mail-archive.com/jquery-en@googlegroups.com/msg44887.html
有时需要创建一个 事件编程。 (这是 与举办活动不同 功能(触发)
这可以通过以下火灾来完成 代码
> var el=document.getElementById("ID1")
>
> fire(el,'change')
>
>
> function fire(evttype) {
> if (document.createEvent) {
> var evt = document.createEvent('HTMLEvents');
> evt.initEvent( evttype, false, false);
> el.dispatchEvent(evt);
> } else if (document.createEventObject) {
> el.fireEvent('on' + evttype);
> } } looks like this trick is not yet in jQuery, perhaps for a
> reason?
答案 4 :(得分:0)
这似乎对我有用(见fiddle)。你有其他可能是问题的代码吗?你是如何定义你的onchange处理程序的?
您是否在onchange处理程序中调用了e.target?我怀疑这可能是问题...因为你以编程方式进行更改,所以没有相应的窗口事件。