如何以编程方式在输入上强制发生onchange事件?

时间:2020-03-06 14:45:16  来源:igfitidea点击:

如何以编程方式在输入上强制发生onchange事件?

我已经尝试过这样的事情:

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

但是我的最终目标是触发所有侦听器功能,但这似乎行不通。只是更新'value'属性也不会。

解决方案

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

它允许我们执行一些反射样式的工作,以找到要触发的正确事件处理程序。

嗯,不要对任何东西使用eval。好吧,有某些事情,但它们极为罕见。
相反,我们可以这样做:

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

在这里查看更多选项:
http://jehiah.cz/archive/firing-javascript-events-properly

取自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事件,就好像实际已发生更改一样。

出于某种原因,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仍然有效。

在jQuery中,我主要使用:

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