通过 SSL 在 IE 中未定义的 JavaScript key

标签 javascript http ssl https keycode

我正在开发一个 Web 应用程序,该应用程序使用 HTTP 在 LAN 内运行良好,但是当我通过 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 对于 IE over SSL 未定义但在 HTTP 上工作正常的任何线索?更好的是,有人可以告诉我如何克服这个问题吗? FWIW,我不需要支持版本 7 之前的 IE。

更新:

有一个建议更换的答案

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

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

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

最佳答案

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

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

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

|| 是做什么的?对于一个它是逻辑或运算符,如果其中一侧的计算结果为 bool 值 true,它将返回 true。

它在JS中还有另外一个用途。如果你给它两个参数并且第一个参数是未定义的,它会返回第二个参数。这意味着,在上面的代码中,如果未定义 e,您将获得 window.event,这是 IE 的传统事件对象。

e.keyCode || 同样如此e.which 使用存在的那个。所以最后,您可能会在各种浏览器上得到一个有效的 key 代码。仙境中一切都好。

但是等等,您的原始代码不是做类似的事情吗?

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

嗯嗯。那是什么? JavaScript 区分大小写,因此 window.Event 与上面代码中的 window.event 相同。 window.event 是 IE 的传统事件对象,您可以使用它来获取有关发生的事件的信息,而 window.Event(您可以从首字母大写看出)是一个构造函数,或者更具体地说,在这种情况下 an interface .

要点是,在该代码中,它用于检测 Mozilla。如果存在,请选择 e.which(Mozilla 存储 key 代码的位置之一),否则选择 e.keyCode IE 将存储 key 代码的位置。

但是,这是基于一个有缺陷的假设,即 IE 没有定义 window.Event 构造函数。它至少从 IE8 开始定义了它。这意味着在较新版本的 IE 上,e.which 被选中而不是 e.keyCodee.which 从来没有也永远不会在 IE 中得到支持。这就是 key 最终未定义的原因。

但是,嗯,为什么加密连接和未加密连接之间存在差异?这是一个很好的问题。虽然如果不访问您的开发环境我无法确定,但我会假设它与 IE 的兼容模式有关。

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

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

底线:使用新代码。

关于通过 SSL 在 IE 中未定义的 JavaScript key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5628871/

相关文章:

javascript - 在 ReactJS 中重新创建单选按钮行为

javascript - Socket.io socket.emit ack 从不运行

java - Spring Framework MVC 中的 "Webpage has expired"

javascript - XMLHttpRequest 调用不包含 If-Modified-Since header

ssl - 为什么 grpc 服务器示例使用 net.Listen 而不是 tls.Listen

Javascript 做 ssl 固定?

ssl - 如何在 JBoss Fuse 6.3 的多个端口上配置 HTTPS

javascript - 如何更好地组织 JavaScript 中的连续替换方法?

javascript - phantomjs - page.evaluate 更新后无法正确渲染页面;页面#内容正确显示

node.js - 如何从 Node js中的http post请求获取上传进度信息?