整理一下常见的IE错误( 二 )


具体来说 , 如果在对象被销毁之后 , 又给该对象赋值 , 就会导致未找到成员错误 。而导致这个错误的 , 一定是COM 对象 。发生这个错误的最常见情形是使用event 对象的时候 。IE中的event对象是window的属性 , 该对象在事件发生时创建 , 在最后一个事件处理程序执行完毕后销毁 。假设你在一个闭包中使用了event 对象 , 而该闭包不会立即执行 , 那么在将来调用它并给event 的属性赋值时 , 就会导致未找到成员错误 , 如下面的例子所示 。

整理一下常见的IE错误

文章插图
在这段代码中 , 我们将一个单击事件处理程序指定给了文档 。在事件处理程序中 , window.event被保存在event 变量中 。然后 , 传人setTimeout()中的闭包里又包含了event变量 。当单击事件处理程序执行完毕后 , event 对象就会被销毁 , 因而闭包中引用对象的成员就成了不存在的了 。换句话说 , 由于不能在COM对象被销毁之后再给其成员赋值 , 在闭包中给returnValue 赋值就会导致未找到成员错误 。
未知运行时错误
当使用innerHTML或outerHTML以下列方式指定HTML时 , 就会发生未知运行时错误( Unknown runtime error ):一是把块元素插入到行内元素时 , 二是访问表格任意部分( table 、 tbody等)的任意属性时 。例如 , 从技术角度说 , span标签不能包含div之类的块级元素 , 因此下面的代码就会导致未知运行时错误:
span.innerHTML = "div Hi /div"; //这里 , span包含了div元素
在遇到把块级元素插入到不恰当位置的情况时 , 其他浏览器会尝试纠正并隐藏错误 , 而IE在这一点上反倒很较真儿 。
语法错误
通常 , 只要IE一报告发生了语法错误( syntax error ) , 都可以很快找到错误的原因 。这时候 , 原因可能是代码中少了一个分号 , 或者花括号前后不对应 。然而 , 还有一种原因不十分明显的情况需要格外注意 。
如果你引用了外部的JavaScript 文件 , 而该文件最终并没有返回JavaScript代码 , IE也会抛出语法错误 。例如 , script元素的src特性指向了一个HTML文件 , 就会导致语法错误 。报告语法错误的位置时 , 通常都会说该错误位于脚本第一行的第一个字符处 。Opera 和Safari 也会报告语法错误 , 但它们会给出导致问题的外部文件的信息;IE就不会给出这个信息 , 因此就需要我们自己重复检查一遍引用的外部JavaScript文件 。但Firefox会忽略那些被当作JavaScript 内容嵌入到文档中的非JavaScript文件中的解析错误 。
在服务器端组件动态生成JavaScript 的情况下 , 比较容易出现这种错误 。很多服务器端语言都会在发生运行错误时 , 向输出中插入HTML代码 , 而这种包含HTML的输出很容易就会违反JavaScript语法 。如果在追查语法错误时遇到了麻烦 , 我们建议你再仔细检查一遍引用的外部文件 , 确保这些文件中没有包含服务器因错误而插入到其中的HTML 。
系统无法找到指定资源
系统无法找到指定资源(The system cannot locate the resource specified )这种说法 , 恐陷要算是IE给出的最有价值的错误消息了 。在使用JavaScript 请求某个资源URL , 而该URL的长度超过了IE 对URL最长不能超过2083个字符的限制时 , 就会发生这个错误 。IE不仅限制JavaScript中使用的URL的长度 , 而且也限制用户在浏览器自身中使用的URL长度(其他浏览器对URL 的限制没有这么严格) 。IE 对URL路径还有一个不能超过2048个字符的限制 。下面的代码将会导致错误 。
整理一下常见的IE错误

文章插图
在这个例子中 , XMLHttpRequest对象试图向一个超出最大长度限制的URL发送请求 。在调用open()方法时 , 就会发生错误 。避免这个问题的办法 , 无非就是通过给查询字符参数起更短的名字 , 或者减少不必要的数据 , 来缩短查询字符串的长度 。另外 , 还可以把请求方法改为POST , 通过请求体而不是查询字符串来发送数据 。

推荐阅读