IE上的JavaScript密钥未定义SSL

时间:2011-04-11 23:51:00

标签: javascript http ssl https keycode

我正在开发一个使用HTTP在局域网内正常工作的网络应用程序,但是当我通过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;

有效。现在的问题是我不能接受这个答案,因为它已被删除。

2 个答案:

答案 0 :(得分:1)

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

所以,建议的代码是:

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(您可以从首字母大写字母中看到)是构造函数,或者更具体地说是在这种情况下{ {3}}。

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

然而,这是基于IE没有定义window.Event构造函数的错误假设。它确实至少在IE8中定义了它。这意味着在较新版本的IE上选择e.which而不是e.keyCode。 IE中永远不会支持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成为一个厚脸皮的猴子。

底线:使用新代码。

答案 1 :(得分:0)

最有可能的是,你已经在http(而不是https)中加入了一个脚本,这个脚本无法加载,因为页面本身是安全的,而且包含的文件不安全。