如何以编程方式强制输入onchange事件?

时间:2008-09-25 22:32:53

标签: javascript

如何以编程方式强制输入onchange事件?

我尝试过这样的事情:

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

但我的最终目标是触发任何侦听器功能,这似乎不起作用。也不仅仅是更新'value'属性。

10 个答案:

答案 0 :(得分:89)

在jQuery中我主要使用:

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

答案 1 :(得分:84)

创建一个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 });

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

答案 2 :(得分:59)

对于任何,请不要使用eval。嗯,有一些事情,但它们非常罕见。 相反,你会这样做:

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

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

答案 3 :(得分:21)

由于某种原因,ele.onchange()在我的页面上为我在IE中抛出了一个“找不到方法”的expception,所以我最终在提供的链接Kolten中使用了这个函数并调用了fireEvent(ele, '改变'),有效:

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事件声明任何内容。但是火灾事件仍然有效。

答案 4 :(得分:2)

取自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事件,就好像某些东西实际发生了变化一样。

答案 5 :(得分:1)

对于IE和Chrome,这是最正确的答案:

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);

答案 6 :(得分:1)

如果您使用以下代码段添加所有事件:

//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>(),其中<EVENTNAME>是您的事件的名称,它将使用<EVENTNAME>调用所有事件

答案 7 :(得分:0)

用于触发Javascript中的任何事件。

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})

答案 8 :(得分:-4)

如果您使用的是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

它允许你做一些反射式的工作来找到要触发的正确的事件处理程序。

答案 9 :(得分:-4)

使用JQuery,您可以执行以下操作:

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

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