我正在开发一个使用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;
有效。现在的问题是我不能接受这个答案,因为它已被删除。
答案 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)中加入了一个脚本,这个脚本无法加载,因为页面本身是安全的,而且包含的文件不安全。