javascript基础从小白到高手系列五百零四:旧版IE 的常见错误

IE 曾是最难调试JavaScript 错误的浏览器之一。该浏览器的旧版本抛出的错误通常比较短,比较含
糊,缺少上下文。接下来几节分别讨论旧版IE 中可能会出现的常见且难于调试的JavaScript 错误。因为
这些浏览器不支持ES6,所以代码会考虑向后兼容。
无效字符
JavaScript 文件中的代码必须由特定字符构成。在检测到JavaScript 文件中存在无效字符时,IE 会抛
出"invalid character"错误。所谓无效字符,指的是JavaScript 语法中没有定义过的字符。例如,
一个看起来像减号而实际上并不是减号的字符(Unicode 值为\u2013)。这个字符不能用于代替减号
(ASCII 码为45),因为它不是JavaScript 语法定义的减号。这个特殊字符经常会被自动插入Word 文档,
因此如果把它从Word 文档复制到文本编辑器然后在IE 中运行,IE 就会报告文件中包含非法字符。其他浏览器也类似,Firefox 抛出"illegal character"错误,Safari 报告语法错误,而Opera 则报告
ReferenceError(因为把这个字符当成了未定义标识符来解释)。
未找到成员
如前所述,旧版IE 中所有DOM对象都是用COM 对象实现的,并非原生JavaScript 对象。在涉及
垃圾回收时,这可能会导致很多奇怪的行为。其中,"member not found"错误是IE 中垃圾回收程序
常报告的错误。
这个错误通常会在给一个已被销毁的对象赋值时发生。这个对象必须是COM对象才会出现这个消
息。最好的一个例子就是event 对象。IE 的event 对象是作为window 的一个属性存在的,会在事件
发生时创建,在事件处理程序执行完毕后销毁。因此,如果你想在稍后会执行的闭包中使用event 对
象,尝试给event 对象赋值就会导致这个错误,如下面的例子所示:
document.onclick = function() {
var event = window.event;
setTimeout(function(){
event.returnValue = false; // 未找到成员
}, 1000);
};
在这个例子中,文档被添加了单击事件处理程序。事件处理程序把window.event 对象保存在一
个名为event 的本地变量中。然后,在传递给setTimeout()的闭包中引用这个事件变量。当onclick
事件处理程序退出后,event 对象会被销毁,因此闭包中对它的引用也就不存在了,于是就会报告未找
到成员错误。之所以给event.returnValue 赋值会导致"member not found"错误,是因为不能给
已将其成员销毁的COM对象赋值。
未知运行时错误
使用innerHTML 或outerHTML 属性以下面一种方式添加HTML 时会发生未知运行时错误:比如将
块级元素插入行内元素,或者在表格的任何部分(

、等)访问了其中一个属性。例如,
从技术角度来说,

标签不能包含另一个块级元素,如

,因此以下代码会导致未知运行时错误:
p.innerHTML = “
Hi
”; // where p contains a

element
在将块级元素插入不恰当的位置时,其他浏览器会尝试纠正,这样就不会发生错误,但IE 在这种
情况下要严格得多。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值