IE从网络位置运行时,含多比较运算符的onkeypress为何无法调用JS函数?
我在工作中需要维护一组模拟旧系统的HTML文件,这些文件通过onkeypress或onkeydown事件绑定JavaScript函数,实现按下特定按键时跳转页面的功能。最近遇到了一个非常奇怪的问题,具体情况如下:
复现用示例代码
下面是精简后的测试代码,保留了实际文件的核心元素,可以100%复现问题(针对数字小键盘回车键的触发逻辑):
<!DOCTYPE html> <html> <head> <style> body { margin: 0; } img { margin: 0; border: 0; } </style> <script> function nav() { var x = event.keyCode; var y = event.location; if (x == 13 && y === 3) { document.location = "http://www.google.com.au" } } </script> </head> <body onkeypress="nav()"> <map name="test"> <area href="http://www.google.com.au" title="Alternate naviagion" shape="rect" coords="131,680,160,705"> </map> <img src="ThisPagesImage.png" alt="" usemap="#test"> </body> </html>
不同打开方式的表现
从本地桌面打开
IE底部会弹出提示:
Internet Explorer has restricted this webpage from running scripts or ActiveX controls. [Allow blocked content]
点击「允许阻止的内容」后,按下数字小键盘回车键可以正常触发nav()函数,实现页面跳转。
从网络驱动器打开
完全没有脚本/ActiveX控件受限的提示,但nav()函数完全无法被调用——我甚至把代码里的document.location替换成window.alert("Hello World")测试,桌面打开能正常弹窗,网络驱动器打开则毫无反应。
最奇怪的差异点
如果把nav()函数改成仅检查keyCode的单条件版本,网络驱动器打开时就完全正常,函数能被正常触发:
function nav() { var x = event.keyCode; if (x == 13) { document.location = "http://www.google.com.au" } }
核心问题总结
当HTML文件从网络驱动器打开时,包含双条件判断(同时检查event.keyCode和event.location)的函数无法被调用;但仅检查event.keyCode的单条件函数可以正常运行。而从本地桌面打开时,允许脚本权限后两个版本的函数都能正常工作。
我的限制条件
- 工作场所主要使用Internet Explorer,必须优先适配IE环境
- 我无法控制系统或网络设置,只能用现有资源来实现培训用的旧系统模拟
- 必须优先使用数字小键盘回车键来触发函数,这样才能准确模拟原系统的操作逻辑
- 已经查找过相似问题但没有找到有效解答,调试时IE开发者控制台也没有任何报错信息
当前使用的IE版本:11.0.9600.19002
内容的提问来源于stack exchange,提问作者Samuel Everson

