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