Javascript手动触发.onchange()事件

时间:2010-10-22 12:08:26

标签: javascript input onchange

我有一个输入字段,我想分配一个新值并触发.onchange()事件。我做了以下事情:

document.getElementById("range").value='500';
document.getElementById("range").onchange();

范围是我的输入ID。 我收到以下错误:

Uncaught TypeError: Cannot read property 'target' of undefined

有没有办法定义'目标'? 谢谢

5 个答案:

答案 0 :(得分:8)

关于target的错误是因为事件处理程序中的代码试图读取与change事件关联的target对象的Event属性。你可以尝试传入一个虚假事件来欺骗它:

var range= document.getElementById('range');
range.onchange({target: range});

或者,如果可以,请将处理程序代码更改为使用this而不是event.target。除非您正在使用委托(从父级捕获子对象的更改事件,对于更改事件很麻烦,因为IE不会“冒泡”它们),更改事件的目标始终是事件处理程序的元素已注册,使event.target多余。

如果事件处理程序使用Event的更多属性而不仅仅是target,则需要伪造更多属性,或者使用“真正的”浏览器界面来调度事件。如果事件侦听器可能正在使用(IE中为addEventListenerattachEvent),则这也是必要的,因为它们在直接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://api.jquery.com/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?我怀疑这可能是问题...因为你以编程方式进行更改,所以没有相应的窗口事件。