在为Internet Explorer编写javascript时要避免哪些常见错误?

时间:2010-09-30 15:43:56

标签: javascript internet-explorer

我即将开始编写一个新的,重量级的网站,但在开始之前,我想通过事先了解怪癖是什么来最小化我在Internet Explorer中的调试时间。我不打算过多担心IE6。

在其他浏览器中可以正常工作但在Internet Explorer中中断的javascript代码中常见的错误/差异有哪些?

13 个答案:

答案 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',}

如果你不了解它可能会非常恼人。这些问题可能都是我经常运行的问题因为我习惯了python,但它仍然值得关注。

答案 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)

在IE9之前,IE的JS引擎。真的,真的很慢。比Mozilla和Webkit实现慢几百到几千倍。

这显示了动画计时器的最小分辨率,完成排序的时间和(如@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)

使用jQueryPrototype等框架,您无需担心。

编辑:

我应该澄清一下。你会担心的更少。如:

  • ActiveXObject vs XMLHttpRequest
  • attachEvent vs addEventListener

列出项目 -