即,javascript和'item'作为变量名称

时间:2011-06-22 06:16:14

标签: javascript cross-browser

这被认为是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是一个具有某些属性的对象......

那么,一个错误或一个新手的错误?

干杯

2 个答案:

答案 0 :(得分:7)

您的代码确实存在错误,因为您从未声明item变量,因此成为Horror of Implicit Globals的牺牲品。

我的猜测是,您的网页上有一些内容包含nameid“项目”,因此会成为window的属性,因为IE会这样做(以及许多其他浏览器也纷纷效仿。您可能知道,window的属性是全局变量,因此当您尝试分配函数中的item符号时,您将分配给该全局属性。取决于item是什么,IE可能正在尝试应用“不实际分配给对象,而是分配给它的默认属性而不是”逻辑(因为如果它想要与宿主对象一起允许这样做)并遇到了一个问题。

声明你的本地变量(总是一个好主意),问题应该消失。


更新:既然你已经发布了实际的错误,那么上面发生的事情的理由可能不是正确的,但建议(声明本地)保持不变。 : - )

答案 1 :(得分:3)

IE和其他一些浏览器习惯在每个具有id的元素的全局范围中添加引用,因此item在IE中已经有值的可能原因是你有一个元素与id="item"

如果在函数中将item变量声明为局部变量,那么它在全局范围内也不存在问题:

var item;