奇怪的IE错误 - 在JavaScript全局变量和具有name属性的元素之间

时间:2010-10-13 14:53:58

标签: javascript internet-explorer

我在IE6,IE7和IE8中测试了以下代码,结果相同:

  

<a name="cd"/>a</a>
<script>
try {
cd = new Date;
} catch(e) {
alert(e);
}
</script>

在所有情况下都会引发错误。但是使用

  

var cd = new Date;

似乎解决了这个问题 有谁知道为什么会这样?

以下是一个示例:http://jsbin.com/ahuhu4/2

3 个答案:

答案 0 :(得分:6)

如果不使用var说明符来声明变量,则将变量cd作为属性添加到窗口对象,例如, window.cd。您已经有一个对象元素,它是已经键入的<a name="cd">a</a>窗口的子对象。您不能将新Date指定为此对象的类型,因为它已存在。使用var关键字时,您将该变量重新调整为局部范围并删除其对窗口对象的直接附件。这将删除错误并允许IE继续。其他浏览器引擎处理的方式不同。

答案 1 :(得分:3)

IE非常适合为每个具有“id”值的页面元素创建window的属性。这只是一件事。 (注意:这句话不是真的。

编辑 - 是的,该元素没有“id”。好的,好消息 - IE也会按照名称来处理引用,就好像它们是“id”一样。回想一下,该页面上的document.getElementById("cd")将返回对<a>的引用,就像它具有“id”元素一样。

再次编辑我认为说IE创建实际window属性并不完全正确,至少通过我阅读IE8调试器告诉我的内容。它更像是解释器将对全局变量的隐式引用(在本例中为“cd”)视为请求它通过该名称在全局页面上下文中查找某些内容。对于IE,该过程包括检查具有“id”或“name”值的元素的DOM。通过使用var关键字,您明确告诉解释器您在适用范围(全局,此处)中声明了一个符号,以便跳过“查找”过程。

答案 2 :(得分:0)

// Firefox不会自动为具有ID或名称的元素定义全局变量。 包括#9,Opera 10,Safari 5和Chrome 6在内的IE都保持全球化 滚动文档中的named或id'd元素。

似乎它可以挤占全局命名空间......

function a1(id){
    try{
        window[id].style.color= 'red';
    }
    catch(er){
        return er.message+'\n'+'window.'+id+' = '+window[id];
    }
    return 'window.'+id+'='+window[id];
}
function a2(id){
    window[id]= 'red';
    return 'window.'+id+'='+window[id]
}

/ *

firefox返回窗口[idstring]未定义。

其他人都找到了它,就像旧的IE document.all对象一样。

  • 将id作为全局标识符查询:

警报(A1( 'idstring'))

colors the element red and returns[object HTMLButtonElement] 
(returns [object Object] in older ie browsers)
  • 为全局分配一个新值:alert(a2('idstring'))返回'red'

  • 再次尝试元素警报(a1('idstring'))

  • 抛出错误 - 无法将'window [id] .style'转换为对象

  • 或无法设置undefined或
  • 的属性'color'
  • 表达式的结果'window [id] .style'[undefined]不是对象ot
  • 预期对象

* /