整理一下常见的IE错误

多年以来 , IE一直都是最难于调试JavaScript 错误的浏览器 。IE给出的错误消息一般很短又语焉不详 。而且上下文信息也很少 , 有时甚至一点都没有 。下面几小节将分别探讨一些在IE中难于调试的JavaScript 错误 。
操作终止
在IE8 之前的版本中 , 存在一个相对于其他浏览器而言 , 最令人迷惑、讨厌 , 也最难于调试的错误:操作终止(operation aborted) 。在修改尚未加载完成的页面时 , 就会发生操作终止错误 。发生错误时 , 会出现一个模态对话框 , 告诉你“操作终止 。"单击确定(OK) 按钮 , 则卸载整个页面 , 继而显示一张空白屏幕;此时要进行调试非常困难 。下面的示例将会导致操作终止错误 。

整理一下常见的IE错误

文章插图
这个例子中存在的问题是:JavaScript代码在页面尚未加载完毕时就要修改document.body , 而且script元素还不是body元素的直接子元素 。准确一点说 , 当script节点被包含在某个元素中 , 而且JavaScript代码又要使用appendChi1d、innerHTML或其他DOM 方法修改该元素的父元素或祖先元素时 , 将会发生操作终止错误(因为只能修改已经加载完毕的元素) 。
【整理一下常见的IE错误】要避免这个问题 , 可以等到目标元素加载完毕后再对它进行操作 , 或者使用其他操作方法 。例如 , 为document.body添加一个绝对定位在页面上的覆盖层 , 就是一种非常常见的操作 。通常 , 开发人员都是使用appendChild方法来添加这个元素的 , 但换成使用insertBefore()方法也很容易 。因此 , 只要修改前面例子中的一行代码 , 就可以避免操作终止错误 。


整理一下常见的IE错误

文章插图
在这个例子中 , 新的div元素被添加至document.body的开头部分而不是末尾 。因为完成这一操作所需的所有信息在脚本运行时都是已知的 , 所以这不会引发错误 。
除了改变方法之外 , 还可以把script元素从包含元素中移出来 , 直接作为body的子元素 。例如:
整理一下常见的IE错误

文章插图
这一次也不会发生错误 , 因为脚本修改的是它的直接父元素 , 而不再是间接的祖先元素 。
在同样的情况下 , IE8不再抛出操作终止错误 , 而是抛出常规的JavaScript 错误 , 带有如下错误消息:
HTML Parsing Error: unable to modify the parent Container element before the child element is closed (KB927917).
不过 , 虽然浏览器抛出的错误不同 , 但解决方案仍然是一样的 。
无效字符
根据语法 , JavaScript 文件必须只包含特定的字符 。在JavaScript 文件中存在无效字符时 , IE会抛出无效字符( invalid character )错误 。所谓无效字符 , 就是JavaScript语法中未定义的字符 。例如 , 有一个很像减号但却由Unicode 值8211 表示的字符( u2013 ) , 就不能用作常规的减号( ASCII 编码为45 ),因为JavaScript 语法中没有定义该字符 。这个字符通常是在Word 文档中自动插入的 。如果你的代码是从Word 文档中复制到文本编辑器中 , 然后又在IE 中运行的 , 那么就可能会遇到无效字符错误 。其他浏览器对无效字符做出的反应与IE类似 , Firefox会抛出非法字符(iIlegal character) 错误 , Safari会报告发生了语法错误 , 而Opera 则会报告发生了ReferenceError (引用错误) 。因为它会将无效字符解释为未定义的标识符 。
未找到成员
IE中的所有DOM对象都是以COM 对象 , 而非原生JavaScript对象的形式实现的 。这会导致一些与垃圾收集相关的非常奇怪的行为 。IE中的未找到成员( Member not found )错误 , 就是由于垃圾收集例程配合错误所直接导致的 。

推荐阅读