Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件处理程序在Internet Explorer中不工作_Javascript_Internet Explorer_Javascript Events - Fatal编程技术网

Javascript 事件处理程序在Internet Explorer中不工作

Javascript 事件处理程序在Internet Explorer中不工作,javascript,internet-explorer,javascript-events,Javascript,Internet Explorer,Javascript Events,我正在使用JavaScript创建一个网站。JS部分的目的是将我自己的键盘处理程序附加到某些文本字段。 我设法将问题缩小到像这把小提琴一样简单的代码: 在Firefox、Opera和Chrome中,在三个字段中的任何一个字段中键入一个字符,就会显示一个带有键代码的警告框。然而,在Internet Explorer中(在我的例子中,IE8是我通常支持的最低版本),只有input3可以正常工作-也就是说,它是释放键时显示对话框的唯一字段。尝试在其他两个框中键入不会产生任何结果,只会在控制台中记录一

我正在使用JavaScript创建一个网站。JS部分的目的是将我自己的键盘处理程序附加到某些文本字段。 我设法将问题缩小到像这把小提琴一样简单的代码:

在Firefox、Opera和Chrome中,在三个字段中的任何一个字段中键入一个字符,就会显示一个带有键代码的警告框。然而,在Internet Explorer中(在我的例子中,IE8是我通常支持的最低版本),只有
input3
可以正常工作-也就是说,它是释放键时显示对话框的唯一字段。尝试在其他两个框中键入不会产生任何结果,只会在控制台中记录一个错误:
keyCode为空或不是对象
(不确定错误消息是否正确,我将其从我的母语翻译过来)。
似乎只有第三种解决方案可以在不考虑浏览器的情况下工作,但在我的场景中,我必须使用第一种或第二种解决方案

我为进一步调查制作了另一把小提琴:

单击这两个按钮时,会显示一个消息框。在Firefox、Opera和Chrome中,框上写着“[object MouseeEvent]”,而在IE中则写着“undefined”。
我能做些什么?提前谢谢你的帮助

另外,正如第一把小提琴所指出的,如果我使用内联事件处理,一切都可以正常工作。然而,我在这个项目中的目标是完全分离HTML和JS,所以我不能使用它。我是为一个朋友做的,我希望HTML部分是简单、清晰的标记代码。

试试这个:

function clickHandler(e) {
    if(!e)
        e = window.event;
    alert(e);
}
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;

        }

    }   
}

您不应该使用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`属性

用法示例:

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

尝试以下方法:

function clickHandler(e) {
    if(!e)
        e = window.event;
    alert(e);
}
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)"

它在IE9中对我有效。这把小提琴在IE中对你不起作用?不,它不起作用。显然IE9更符合标准,我强烈建议您使用JQuery,尤其是它的委托事件处理特性。它在我使用过的所有浏览器(包括IE8)中都工作得很好,而且它在页面上的执行速度要快得多,否则会有许多单独的事件处理程序。使用JQuery的委托功能可以非常有助于从HTML中分离代码。您使用的是什么版本的IE?谢谢您的全面回答。另外,感谢您指出我可能需要一个框架。我可能会在未来的项目中这样做。