好的,即使它不是我的答案,我也会重新添加该答案,并在此过程中添加一些信息,以便您可以接受它,即使它从一开始就不是我的答案。
所以,建议的代码是这样的:
var key;
e = e || window.event;
key = e.keyCode || e.which;
做什么||
?一方面,它是逻辑或运算符,如果其中一侧评估为布尔值 true,它将返回 true。
它在 JS 中还有另一个用途。如果你给它两个参数并且第一个是未定义的,它将返回第二个参数。这意味着,在上面的代码中,如果e
未定义,您将获得window.event
IE 的传统事件对象。
e.keyCode || e.which
无论使用哪个存在,都一样。所以最后,你很可能会在各种浏览器上得到一个有效的密钥代码。在仙境中一切都很好。
但是等等,你的原始代码不做类似的事情吗?
var key = (window.Event) ? e.which : e.keyCode;
嗯。那是什么?JavaScript 区分大小写,因此window.Event
与上面 的代码不同window.event
。window.event
是 IE 的传统事件对象,您将使用它来获取有关发生的事件的信息,而window.Event
(您可以从首字母大写字母中看到)是一个构造函数,或者更具体地说,在这种情况下是一个 interface。
重点是,在该代码中,它用于检测 Mozilla。如果存在,请选择e.which
(Mozilla 存储密钥代码的位置之一),否则选择e.keyCode
IE 存储密钥代码的位置。
但是,这是基于 IE 没有window.Event
定义构造函数的错误假设。至少,它确实将其定义为 IE8。这意味着在较新版本的 IE 上e.which
被选中。从来没有也永远不会在 IE 中得到支持。这就是为什么最终是未定义的。e.keyCode
e.which
key
但是,嗯,为什么加密和未加密的连接会有所不同?这是个好问题。虽然没有访问您的开发环境我无法确定,但我认为它与 IE 的兼容模式有关。
IE 在历史上(过去 10 年)一直是周围最古怪和非标准的浏览器。这导致人们 a) 根据 IE 的标准无知地编程 b) 为 IE 的行为创建变通方法。如果 MS 只是使 IE 标准兼容,那将破坏许多以一种或另一种方式依赖 IE 古怪行为的页面。微软通过让 IE8+ 模拟旧版本的 IE 来承认这一点,因此除非另有说明,否则页面不会中断。
我只能假设,无论出于何种原因,在您的测试环境中,页面最终以“IE7”模式运行,该模式可能没有window.Event
定义构造函数/接口。这将使您的旧代码使用e.keyCode
没问题。然后可能在您的生产环境中,或者可能只是因为加密连接(只有 ghawd 知道 MS 在做什么),您最终会使用较新的 IE 模式,因此window.Event
实际上已定义并e.which
选择了该模式。这让 IE 变成了一只厚脸皮的猴子。
底线:使用新代码。