代码之家  ›  专栏  ›  技术社区  ›  Herman Schaaf

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

  •  16
  • Herman Schaaf  · 技术社区  · 15 年前

    我正准备开始编写一个新的、大量使用javascript的网站,但在开始之前,我想通过事先知道什么是怪癖来最小化我在Internet Explorer中的调试时间。我不打算太担心IE6。

    在其他浏览器中运行良好但在Internet Explorer中中断的javascript代码中,要避免哪些常见错误/差异?

    13 回复  |  直到 8 年前
        1
  •  8
  •   lincolnk    15 年前

    如果通过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
    }
    

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

    <input type="text" onclick="myMethod(event);"></input>
    

    这是跨浏览器,如果你必须走那条路线,也可以。

    使用 attachEvent 要设置事件处理程序,提供 事件 对象自动作为方法的参数。

        2
  •  7
  •   Pointy    15 年前

    这里有一个微妙的问题:如果您的站点有多个帧(或iframes),并且有时在帧之间有javascript代码通信,即(6和7,不太确定8和9)对于javascript对象的“沿袭”非常挑剔,即使是没有任何dom引用的对象。这意味着,如果您将几乎任何类型的javascript对象(字符串和数字通常都可以,但即使是日期实例在过去也会导致我出现问题)从一个帧传递到另一个帧,如果在某个时间点以后 来源 框架被更新为一个新的页面,如果目标页面试图与该通信对象混淆,那么它将得到一个异常。火狐对这类事情相当熟悉,但是当IE垃圾收集旧页面时,它不喜欢引用页面创建的javascript对象。

        3
  •  7
  •   Herman Schaaf    15 年前

    IE(8或更低,不确定是否为9)无法处理像数组这样的字符串中的字符访问,如:

    var str = 'abc';
    var c = str[2];
    alert(c)
    

    在大多数浏览器中,这将警告“c”,但ie警告“undefined”。出于跨浏览器的原因,您应该使用charat函数:

    var str = 'abc';
    var c = str.charAt(2);
    alert(c)
    

    这也会提醒IE中的“C”。

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

    ar = [1,2,3,]
    

    以及

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

    如果你不知道的话,这会很刺激。这两个问题可能都是我经常遇到的问题,因为我已经习惯了Python,但仍然值得注意。

        4
  •  6
  •   some    15 年前

    将字符串与+

    var str="";
    for (var i = 0; i < max; ++i) {
      str += somefunction(i);
    }
    

    在MSIE上可能需要几分钟。我曾经做过一个测试,Opera和火狐在几秒钟后就完成了,但是MSIE在20分钟后还没有完成!

    但是,如果使用数组,msie速度很快:

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

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

        5
  •  5
  •   Dan Davies Brackett    15 年前

    IE9之前的IE JS引擎是 缓慢的 . 真的,真的很慢。比Mozilla和WebKit实现慢数百到数千倍。

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

        6
  •  4
  •   Gepsens    15 年前

    了解Internet Explorer如何处理DOM树分析和导航,尤其是在分析httpobjects时,通常也存在这样一个问题:

    • xmlNode.textContent 不返回Internet Explorer中的任何内容
    • xmlNode.firstChild.nodeValue 或者必须使用返回节点值的内容

    -

        7
  •  4
  •   hvgotcodes    15 年前

    Internet Explorer。

    更严重的是,后面的逗号答案在另一个答案中是好的。使用一个框架可以有所帮助,但这并不是一劳永逸。您将不得不处理跨浏览器问题。因此,请确保在您关心的所有版本中进行测试。

        8
  •  4
  •   AutoSponge    15 年前

    IE不支持自定义事件,只支持DOM事件(即使在9测试版中也是如此)。

        9
  •  2
  •   Spudley Pat    15 年前

    在编写一个必须支持IE的站点时,最常见的错误是忘记在每个版本中进行测试。

    您需要确保您的所有代码都在IE6(如果您计划支持它)、IE7、IE8和IE8-in-IE7模式下工作。还有IE9(现在是beta版)。

    测试多个版本的IE有几个捷径,但是要注意,它们并不总是给出与真实用户所看到的完全相同的结果;唯一确定的方法是在真实版本的IE中测试它,不管这有多痛苦。

        10
  •  1
  •   Community Mohan Dere    9 年前

    注意处理iframe边框的方式等细微差别( How to Remove an IFrame border in Javascript )。

    我想是 internet-explorer tag 应该给你很多好的例子。

        11
  •  1
  •   Community Mohan Dere    9 年前

    如果你想测量一件事需要多长时间,你应该知道时间的分辨率在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 链接到 a blog post by John Resig 从2008年11月12日在上述评论。当我读到这篇文章的时候,我忍不住笑了一下,因为我已经知道它很多年了,早在Netscape是普通浏览器的时候。

    当我想到它的时候,我有一个非常微弱的内存,从一开始Netscape的分辨率也很低,可能是通过读取每秒更新18.2次的系统时间,但后来改变了它,所以它给出了1毫秒分辨率的时间。然而,既然这应该发生在15年前,我不确定它是否正确,我也不打算去证明它。

    为了可读性,我使用上面的gettime而不是一元运算符

        12
  •  0
  •   jprism    11 年前

    除非控制台窗口打开,否则IE 7/8无法理解console.log/dir。如果将JS留在prod环境中,这很容易破坏JS。总是有

    if(window.console)
       console.log('Hello World')
    
        13
  •  -1
  •   Josiah Ruddell    15 年前

    使用类似的框架 jQuery Prototype 你不用担心。

    编辑:

    我应该澄清一下。你就不用担心了。例如:

    • ActiveXObject与XMLHttpRequest
    • AttachEvent与AddEventListener

    列表项-