我正在使用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部分是简单明了的标记代码。
答案 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)"