【问题标题】:JavaScript key undefined in IE over SSL通过 SSL 在 IE 中未定义 JavaScript 键
【发布时间】:2011-08-03 11:40:50
【问题描述】:

我正在开发一个使用 HTTP 在 LAN 内运行良好的 Web 应用程序,但是当我通过 SSL 对其进行远程测试时,它在 IE(7 和 8)中失败。 Firefox、Camino 和 Safari 都可以完美运行。

我已将问题追溯到 key 未定义。相关的代码是:

function showResult(e,str,num) {
    var key = (window.Event) ? e.which : e.keyCode;

    if(((key > 32 && key < 58) || (key > 64 && key < 91) || (key > 95 && key < 123)) && (str.length >= num)) {

关于为什么key 在 SSL 上的 IE 未定义但在 HTTP 上可以正常工作的任何线索?更好的是,有人能告诉我如何克服这个问题吗? FWIW,我不需要在版本 7 之前支持 IE。

更新:

有一个答案建议更换

var key = (window.event) ? e.which : e.keyCode;

var key;
e = e || window.event;
key = e.keyCode || e.which;

这行得通。现在的问题是我不能接受那个答案,因为它已经被删除了。

【问题讨论】:

  • console.log(window.Event) 包含什么内容?
  • 您确定要将事件对象传递给此函数吗?在 IE 中断言 e == window.event

标签: javascript http ssl https keycode


【解决方案1】:

好的,我会重新添加那个答案,即使它不是我的,并在此过程中添加一些信息,这样你就可以接受它,即使它从一开始就不是我的答案。

所以,建议的代码是这样的:

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(您可以从首字母大写字母中看到)是一个构造函数,或者更具体地说,在本例中为 an interface

重点是,在该代码中,它用于检测 Mozilla。如果存在,请选择e.which(Mozilla 存储密钥代码的地方之一),否则请选择e.keyCode,IE 将存储密钥代码。

但是,这是基于 IE 没有定义 window.Event 构造函数的错误假设。至少,它确实将其定义为 IE8。这意味着在较新版本的 IE 上,e.which 被选择而不是 e.keyCodee.which 从来没有也永远不会在 IE 中得到支持。这就是 key 最终未定义的原因。

但是,呃,为什么加密和未加密的连接会有所不同?这是一个很好的问题。虽然没有访问您的开发环境我无法确定,但我认为它与 IE 的兼容模式有关。

IE 在历史上(过去 10 年)一直是周围最古怪和非标准的浏览器。这导致人们 a) 根据 IE 的标准无知地编程 b) 为 IE 的行为创建变通方法。如果 MS 只是使 IE 标准兼容,那将破坏许多以一种或另一种方式依赖 IE 古怪行为的页面。 Microsoft 通过让 IE8+ 模拟旧版本的 IE 来承认这一点,因此除非另有说明,否则页面不会中断。

我只能假设,无论出于何种原因,在您的测试环境中,页面最终以“IE7”模式运行,该模式可能没有定义window.Event 构造函数/接口。这将使您的旧代码使用e.keyCode,这很好。然后可能在您的生产环境中,或者可能只是因为加密连接(只有 ghawd 知道 MS 在做什么),您最终会使用更新的 IE 模式,因此实际上定义了 window.Event 并选择了 e.which。这让 IE 变成了一只厚脸皮的猴子。

底线:使用新代码。

【讨论】:

  • 感谢您的回答和解释。虽然我通常用 C 编写代码,因此习惯于处理区分大小写的问题,但我是 JavaScript 新手,我所拥有的大部分内容都是复制和粘贴。事实上,var key = (window.Event) ? e.which : e.keyCode; 是从 SO 上的另一个答案复制而来的。 :)
【解决方案2】:

很可能,您通过 http(而不是 https)包含了一个脚本,该脚本将无法加载,因为页面本身是安全的,而包含的文件不安全。

【讨论】:

  • 所有包含仅由相对路径引用。我还可以通过用if(str.length &gt;= num) { 临时替换测试行来让一切正常工作。当然,它不再过滤掉不需要的键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2011-07-18
相关资源
最近更新 更多