2012-04-11 93 views
2

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

我已经创建了进一步调查另一个小提琴:
http://jsfiddle.net/bSdaJ/
按钮的两个,点击后,会导致一个消息框来显示。在Firefox,Opera和Chrome中,框中显示“[object MouseEvent]”,而在IE中则显示“未定义”。
我该怎么办?感谢您提前提供任何帮助。

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

+0

它为我的IE9。小提琴在IE中不适合你吗? – 2012-04-11 19:20:35

+0

不,它没有。显然,IE9更符合标准。 – rhino 2012-04-11 19:21:14

+0

您使用的是什么版本的IE? – 2012-04-11 19:28:45

回答

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属性(在其他浏览器的方法是正确的)。

+0

谢谢您的全面解答。另外,感谢您指出我可能需要一个框架。我可能会在未来的项目中这样做。 – rhino 2012-04-11 19:38:29

2

试试这个:

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

+1:这似乎是建议的解决方法。 – 2012-04-11 19:31:18

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)" 
相关问题