我即将开始编写一个新的,重量级的网站,但在开始之前,我想通过事先了解怪癖是什么来最小化我在Internet Explorer中的调试时间。我不打算过多担心IE6。
在其他浏览器中可以正常工作但在Internet Explorer中中断的javascript代码中常见的错误/差异有哪些?
答案 0 :(得分:8)
如果您通过javascript直接指定事件处理程序,event
将自动提供 。
myElement.onclick = function(e) {
alert(typeof e); // undefined
}
解决方法是提取window.event
。
myElement.onclick = function(e) {
e = e || window.event;
alert(typeof e); // this is ok now
}
如果您是直接在元素上的事件处理程序,则可以手动提供event
引用。
<input type="text" onclick="myMethod(event);"></input>
这是跨浏览器并且很好,如果你必须走这条路。
使用attachEvent
设置事件处理程序会自动将event
对象作为方法的参数。
答案 1 :(得分:7)
这是一个微妙的问题:如果您的网站有多个框架(或iframe),并且您有时在框架之间进行Javascript代码通信,那么IE(6和7,不太确定8和9)是非常挑剔的Javascript对象的“沿袭”,即使没有任何DOM引用也是如此。这意味着,如果您将一个几乎任何类型的Javascript对象(字符串和数字通常都可以,但是甚至Date实例在过去引起了我的问题)从一个帧传递到另一个帧,如果在某个时间点之后使用新页面更新源框架,如果目标页面试图弄乱该通信对象,则会出现异常。 Firefox在这方面非常圆润,但是当IE垃圾收集旧页面时,它之后不喜欢对页面创建的Javascript对象的引用。
答案 2 :(得分:7)
IE(8及更低,不确定大约9)无法处理像数组这样的字符串访问字符,如:
var str = 'abc';
var c = str[2];
alert(c)
在大多数浏览器中,这将提醒'c',但IE警告'未定义'。出于跨浏览器的原因,我们应该使用charAt函数:
var str = 'abc';
var c = str.charAt(2);
alert(c)
这也会在IE中警告'c'。
另一个小差异是对象和数组中的尾随逗号。这在大多数浏览器中都有效,但会引发IE中的错误:
ar = [1,2,3,]
以及
ob = {name:'janet', surname:'walker',}
答案 3 :(得分:6)
用+
连接字符串var str="";
for (var i = 0; i < max; ++i) {
str += somefunction(i);
}
在MSIE上可能需要几分钟时间。我曾经做过一次测试,其中Opera和Firefox在几秒钟后完成,但是MSIE在20分钟后没有完成!
但是,如果使用数组,MSIE很快:
var str = [];
for (var i = 0; i < max; ++i) {
str.push( somefunction(i));
}
str = str.join("");
很抱歉,但现在无法找到我发布的帖子。
答案 4 :(得分:5)
这显示了动画计时器的最小分辨率,完成排序的时间和(如@some所指出的)虚假字符串连接,以及网站性能受JS引擎本身速度限制的任何其他地方。< / p>
答案 5 :(得分:4)
Internet Explorer。
更严重的是,另一个答案中的逗号回答是好的。使用框架可以提供帮助,但它并非一帆风顺。您将不得不处理跨浏览器问题。因此,请确保您在所关注的所有版本中进行测试。
答案 6 :(得分:4)
请注意Internet Explorer如何处理dom树解析和导航,特别是在解析httpObjects时也存在这种解析和导航:
xmlNode.textContent
在互联网资源管理器中不返回任何内容xmlNode.firstChild.nodeValue
或返回节点值的内容-
答案 7 :(得分:4)
IE不支持自定义事件,只支持DOM事件(即使在9 beta中也是如此)。
答案 8 :(得分:2)
编写必须支持IE的网站时,最常见的错误是忘记在每个版本中进行测试。
您需要确保所有代码都在IE6(如果您打算支持它),IE7,IE8和IE8-in-IE7模式下工作。还有IE9(现在处于测试阶段)。
测试多个IE版本的区域很少,但请注意,它们并不总能提供与真实用户看到的完全相同的结果;唯一可以确定的方法是在IE的真实版本中进行实际测试,无论多么痛苦。
答案 9 :(得分:1)
注意像iframe边框的处理方式(How to Remove an IFrame border in Javascript)之间的差异。
我想internet-explorer tag应该会给你很多很好的例子。
答案 10 :(得分:1)
如果您正在尝试测量时间长度,您应该知道IE中的时间分辨率仅为15毫秒,在FF,Chrome和Opera中为1毫秒。
您可以使用以下代码自行测试:
var end,start = new Date().getTime(); //Gets number of milliseconds since epoch
while( (end = new Date().getTime() ) === start); //Wait for the time to change
alert(end-start); // Shows 1 in FF, Chrome and Opera, but 15 or 16 in MSIE
它已经存在了很长时间并仍然适用于MSIE8,但不是常识。 lincolnk已于2008年11月12日在上述评论中与a blog post by John Resig相关联。当我读到这一点时,我忍不住笑了一下,因为我已经知道了多年,当Netscape是常见的浏览器时。
当我想到它时,我有一个非常微弱的记忆,Netscape从一开始就具有低分辨率,可能是通过读取每秒更新18.2次的系统时间,但后来改变了它,所以它给出了1ms分辨率的时间。然而,由于这应该发生在大约15年前,我不确定它是否正确,我不会试图证明它。
为了便于阅读,我使用的是上面的getTime而不是一元运算符
答案 11 :(得分:0)
除非打开控制台窗口,否则IE 7/8无法理解console.log / dir。如果你在prod环境中留下任何东西,这很容易破坏你的JS。总是有
if(window.console)
console.log('Hello World')
答案 12 :(得分:-1)