【问题标题】:Add a second onChange event?添加第二个 onChange 事件?
【发布时间】:2011-07-26 14:22:45
【问题描述】:

您好,我在网上找到了这个脚本,它向元素添加了一个 onChange 事件,我现在想向同一个元素添加第二个 onChange 事件。脚本如下:

document.getElementById('piname').onchange =
function() {
    removeChildren({
        parentId: 'account_table',
        childName: 'extraaccount'
    });
}

我要添加的 onChange 事件是:

showAccount(this.value)

【问题讨论】:

    标签: javascript onchange


    【解决方案1】:

    使用addEventListener()(如果需要,还可以使用attachEvent)。
    示例:

    document.getElementById('piname').addEventListener("change", function(e){
      e = e || event;
      showAccount(e.target.value);
    }, false);
    

    示例,带有后备:

    var element = document.getElementById('piname');
    if(element.addEventListener){
      element.addEventListener("change", function(e){
        e = e || event;
        showAccount(e.target.value);
      }, false);
    }
    else if(element.attachEvent){
      element.attachEvent("onchange", function(e){
        e = e || event;
        showAccount(e.target.value);
      });
    }
    

    【讨论】:

    • 通过将getElementById 的结果存储在变量中来减少元素查找。此外,this 已正确绑定到 addEventListener 的元素。
    • 嗯 @Andy @Digital 我收到以下错误...uncaught exception: [Exception... "Not enough arguments" nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)" location: "JS frame
    • @Jonah,将false 添加为addEventListener 中的最后一个参数。 FireFox 会抱怨,Chrome 和 Safari 不会。
    • @Zanfa: 是的,在 Firefox 5 之前(包括 Firefox 5)都是正确的。在 Fx 6 中是可选的。
    • @Jonah 使用第二个例子,它有一个使用 attachEvent 的 IE 后备。
    【解决方案2】:

    最简单的方法是缓存旧函数并从新函数中调用:

    var el = document.getElementById('piname'),
        old = el.onchange;
    
    el.onchange = function () {
        old.call(el);
        showAccount(this.value);
    }
    

    除此之外,您可以使用addEventListener(W3C 标准)和attachEvent(IE8 及更低版本):

    var el = document.getElementById('piname'),
        fn = function (e) {
             e = e || window.event;
             showAccount((e.target || e.srcElement).value); 
        };
    
    if ("addEventListener" in el) {
        el.addEventListener("change", fn, false);
    }
    else {
        el.attachEvent("onchange", fn);
    }
    

    这些方法允许您将任意数量的处理程序附加到您喜欢的事件。

    【讨论】:

    猜你喜欢
    • 2013-11-04
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多