Her*_*aaf 16 javascript internet-explorer
我即将开始编写一个新的,重量级的网站,但在我开始之前,我想通过事先知道怪癖是什么来最小化我在Internet Explorer中的调试时间.我不打算过多担心IE6.
在其他浏览器中可以正常运行但在Internet Explorer中中断的javascript代码中常见的错误/差异有哪些?
如果您通过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对象作为参数来自动方法.
这是一个微妙的问题:如果您的网站有多个框架(或iframe),并且您有时在框架之间进行Javascript代码通信,IE(6和7,不太确定8和9)对于"血统"非常挑剔Javascript对象,甚至没有任何DOM引用的对象.这意味着,如果您将几乎任何类型的Javascript对象(字符串和数字通常都可以,但是甚至Date实例在过去导致我出现问题)从一个帧传递到另一个帧,如果在某个时间点之后传递源使用新页面更新框架,如果目标页面试图弄乱该通信对象,则会出现异常.Firefox在这方面非常圆润,但是当IE垃圾收集旧页面时,它之后不喜欢对页面创建的Javascript对象的引用.
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,但它仍然值得关注.
用+连接字符串
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)
对不起,但是找不到我现在发的帖子.
在IE9之前,IE的JS引擎很慢.真的,真的很慢.比Mozilla和Webkit实现慢几百到几千倍.
这显示了动画计时器的最小分辨率,完成排序的时间和(如@some所指出的)虚假字符串连接,以及您的网站性能受JS引擎本身速度限制的任何其他地方.
| 归档时间: |
|
| 查看次数: |
1372 次 |
| 最近记录: |