将事件对象传递给addEvent函数

时间:2013-12-28 13:27:31

标签: javascript

我有跨浏览器addEventListener代码,我需要传递事件对象 这适用于Chrome,但不适用。 那我该怎么办?

function addEvent(element, eventName, eventFunction) { 
        if(element.attachEvent) //Internet Explorer
            element.attachEvent("on" + eventName, function (e) {eventFunction.call(element);}); 
        else if(element.addEventListener) //Firefox & company
            element.addEventListener(eventName, function (e) { eventFunction(e) }, false); 
    }


addEvent(window, 'keydown', changeSpeed);

2 个答案:

答案 0 :(得分:0)

在较旧的IE上,事件对象不作为参数传递,它是一个名为event的全局变量。所以最小的mod是:

function addEvent(element, eventName, eventFunction) { 
    if(element.attachEvent) //Internet Explorer
        element.attachEvent("on" + eventName, function () {eventFunction.call(element, event);}); 
    // No argument ------------------------------------^ use global -------------------^
    else if(element.addEventListener) //Firefox & company
        element.addEventListener(eventName, function (e) { eventFunction(e) }, false); 
}

但有几点注意事项:

  1. 我会首先检查addEventListener ,因为有些浏览器可能会提供attachEvent作为后台来处理旧的特定于IE的代码。

  2. attachEventaddEventListener的行为之间存在其他一些差异,特别是在防止事件的默认行为和停止事件传播方面。这个addEvent函数根本不解决这些问题。

  3. 您未在this版本中正确设置addEventListener

  4. 我没有重新发明这种轮子,而是去购买现有的经过公路测试的轮子并使用它。

答案 1 :(得分:0)

将事件对象直接传递给调用函数

更容易
function addEvent(element, eventName, eventFunction) { 
    if(element.attachEvent) //Internet Explorer
        element.attachEvent("on" + eventName, eventFunction);
    else if(element.addEventListener) //Firefox & company
        element.addEventListener(eventName, eventFunction, false); 
    else //old browser
        element["on" + eventName] = eventFunction;
}

确定IE9,Firefox&共

<input type="text" id="test">
<script>
addEvent(document.getElementById('test'),'keypress',function(e){
    keyCode =(window.event)?window.event.keyCode:e.which;
    alert(keyCode);});
</script>