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

Her*_*aaf 16 javascript internet-explorer

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

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

lin*_*lnk 8

如果您通过javascript直接指定事件处理程序,event不会自动提供.

myElement.onclick = function(e) {
    alert(typeof e); // undefined
}
Run Code Online (Sandbox Code Playgroud)

解决方法是拉window.event.

myElement.onclick = function(e) {
    e = e || window.event;
    alert(typeof e); // this is ok now
}
Run Code Online (Sandbox Code Playgroud)

如果您是元素上的事件处理程序,则可以event手动提供引用.

<input type="text" onclick="myMethod(event);"></input>
Run Code Online (Sandbox Code Playgroud)

这是跨浏览器,如果你必须走这条路线,那很好.

使用attachEvent设定一个事件处理程序提供的event对象作为参数来自动方法.


Poi*_*nty 7

这是一个微妙的问题:如果您的网站有多个框架(或iframe),并且您有时在框架之间进行Javascript代码通信,IE(6和7,不太确定8和9)对于"血统"非常挑剔Javascript对象,甚至没有任何DOM引用的对象.这意味着,如果您将几乎任何类型的Javascript对象(字符串和数字通常都可以,但是甚至Date实例在过去导致我出现问题)从一个帧传递到另一个帧,如果在某个时间点之后传递使用新页面更新框架,如果目标页面试图弄乱该通信对象,则会出现异常.Firefox在这方面非常圆润,但是当IE垃圾收集旧页面时,它之后不喜欢对页面创建的Javascript对象的引用.


Her*_*aaf 7

IE(8及更低版本,不确定大约9)无法处理像数组这样的字符串访问字符,如:

var str = 'abc';
var c = str[2];
alert(c)
Run Code Online (Sandbox Code Playgroud)

在大多数浏览器中,这将警告'c',但IE警告'未定义'.出于跨浏览器的原因,我们应该使用charAt函数:

var str = 'abc';
var c = str.charAt(2);
alert(c)
Run Code Online (Sandbox Code Playgroud)

这也将在IE中提醒'c'.

另一个小的区别是对象和数组中的尾随逗号.这在大多数浏览器中都有效,但会在IE中引发错误:

ar = [1,2,3,]
Run Code Online (Sandbox Code Playgroud)

并且

ob = {name:'janet', surname:'walker',}

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


som*_*ome 6

用+连接字符串

var str="";
for (var i = 0; i < max; ++i) {
  str += somefunction(i);
}
Run Code Online (Sandbox Code Playgroud)

在MSIE上可能需要几分钟.我曾经做过一次测试,其中Opera和Firefox在几秒钟后完成,但是MSIE在20分钟后还没有完成!

但是,如果使用数组,MSIE很快:

var str = [];
for (var i = 0; i < max; ++i) {
   str.push( somefunction(i));
}
str = str.join("");
Run Code Online (Sandbox Code Playgroud)

对不起,但是找不到我现在发的帖子.


Dan*_*ett 5

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

这显示了动画计时器的最小分辨率,完成排序的时间和(如@some所指出的)虚假字符串连接,以及您的网站性能受JS引擎本身速度限制的任何其他地方.


hvg*_*des 4

IE浏览器。

好的,更严重的是,另一个答案中的尾随逗号答案很好。使用框架会有所帮助,但它并不是万能的。您将不得不处理跨浏览器问题。因此,请确保在您关心的所有版本中进行测试。