这被认为是IE中的JS错误吗?
请检查以下功能
function select_deselect_all_items(status)
{
select_deselect_items_under_panel(status, $('myPanel'));
panel = $('myPanel');
var items = panel.getElementsByTagName('input');
for (var n = 0; n < items.length; n++) {
item = items[n];
if (item.id.substr(0, 10) == 'myItems_') {
item.checked = status;
select_deselect_items_under_panel(status, $('myPanel'));
}
}
}
现在,这在FF和Chrome中运行良好,但在IE中生成错误。错误如下:
Error: Unable to get value of the property 'substr': object is null or undefined
我在整个代码中的几个地方都有这个功能(遗憾的是没有把它放到一个js文件中)我已经偶然发现了这个问题。问题似乎是item
变量。如果将其更改为其他内容,即myWildVarName
,则事情似乎正常。我在IE中调试了页面,我发现item
是一个具有某些属性的对象......
那么,一个错误或一个新手的错误?
干杯
答案 0 :(得分:7)
您的代码确实存在错误,因为您从未声明item
变量,因此成为Horror of Implicit Globals的牺牲品。
我的猜测是,您的网页上有一些内容包含name
或id
“项目”,因此会成为window
的属性,因为IE会这样做(以及许多其他浏览器也纷纷效仿。您可能知道,window
的属性是全局变量,因此当您尝试分配函数中的item
符号时,您将分配给该全局属性。取决于item
是什么,IE可能正在尝试应用“不实际分配给对象,而是分配给它的默认属性而不是”逻辑(因为如果它想要与宿主对象一起允许这样做)并遇到了一个问题。
声明你的本地变量(总是一个好主意),问题应该消失。
更新:既然你已经发布了实际的错误,那么上面发生的事情的理由可能不是正确的,但建议(声明本地)保持不变。 : - )
答案 1 :(得分:3)
IE和其他一些浏览器习惯在每个具有id的元素的全局范围中添加引用,因此item
在IE中已经有值的可能原因是你有一个元素与id="item"
。
如果在函数中将item
变量声明为局部变量,那么它在全局范围内也不存在问题:
var item;