事件处理程序无法在Internet Explorer中工作

时间:2012-04-11 19:15:13

标签: javascript internet-explorer javascript-events

我正在使用JavaScript创建一个网站。 JS部分的目的是将我自己的键盘处理程序附加到某些文本字段。 我设法将问题缩小到代码,就像这个小提琴一样简单:
http://jsfiddle.net/k9s3n/1/
在Firefox,Opera和Chrome中,在三个字段的任意中键入字符会导致显示包含密钥代码的警告框。在Internet Explorer(我的情况下是IE8,这是我通常支持的最低版本)中,只有input3正常工作 - 也就是说,它是释放密钥时显示对话框的唯一字段。尝试输入其他两个框没有结果,它只是在控制台中记录错误:
keyCode is null or isn't an object(不确定错误信息是否正确,我是用我的母语翻译的) 似乎只有第三种解决方案无论浏览器如何都能正常工作,但在我的场景中我必须使用第一种或第二种解决方案。

我为进一步调查创造了另一个小提琴:
http://jsfiddle.net/bSdaJ/
单击这两个按钮时,将显示一个消息框。在Firefox,Opera和Chrome中,框中显示“[object MouseEvent]”,而在IE中则表示“未定义”。
我该怎么办?在此先感谢您的帮助。

P.S。正如第一个小提琴所示,如果我使用内联事件处理,一切正常。但是,我在这个项目中的目标是完全分离HTML和JS,所以我不能使用它。我正在为朋友做这件事,我希望HTML部分是简单明了的标记代码。

3 个答案:

答案 0 :(得分:4)

您不应该使用DOM 0事件(通过HTML属性附加的事件)。您应该使用在W3C浏览器中使用element.addEventListener和在IE中使用element.attachEvent附加的事件侦听器。如果您正在构建一个大型网站,那么您应该使用JS框架,但这是一个您没有问过的不同问题。一个框架(最流行的是jQuery)将提供抽象方法来实现这一点,但在没有一个框架的情况下,这是一个跨浏览器的简单函数。

function addEvent(element,evName,fn) {
    if (element.addEventListener) {
        element.addEventListener(evName,fn,false);
    } else if (element.attachEvent) {
        element.attachEvent('on'+evName,function(e) {
            fn(e || window.event);
        });
    }
}

这个简单的函数使用特征检测来规范化浏览器之间的不同事件行为。 IE使用具有不同签名的不同侦听器函数,并且IE也不遵循要求处理程序将事件对象作为参数接收的W3C规范;相反,它设置全局window.event`属性。

使用示例:http://jsfiddle.net/k9s3n/3/

另请注意,IE和W3C浏览器对event.keyCode属性采用不同的方法(因为其他浏览器的方法是正确的)。

答案 1 :(得分:2)

试试这个:

function clickHandler(e) {
    if(!e)
        e = window.event;
    alert(e);
}

答案 2 :(得分:0)

试试这个:

function funcToCall(e)
{

    //alert('here');
    var keycode;
    if (window.event)
    {
        if (window.event.keyCode == '112') {  // F1 was pressed

        // call your methods in this area

        window.event.returnValue = false;
        return false;
        }

    }   
    else if(e) 
    {
        if (e.which == '112') {  // F1 was pressed, search for other keycodes

        // call your methods in this area

        e.preventDefault();
        return false;

        }

    }   
}

打电话给你的短信:

onKeyDown="funcToCall(event)"