奇怪的IE 7 javascript问题

时间:2009-01-20 23:04:53

标签: javascript internet-explorer-7 stomp orbited

我有这个在Firefox,Chrome和Safari中使用的javascript代码

for (idx in all_auction_ids){
    alert(all_auction_ids[idx]);
};

对于上面的内容,而不是获取all_auction_ids中的值,我获得的第一个值是类型函数的文本,看起来像for循环!

但如果我运行下面的代码,它就可以正常工作。

for (idx=0;idx<all_auction_ids.length;idx=idx+1){
    alert(all_auction_ids[idx]);
};

编辑:更新

我做了一些调试并发现,添加Orbited和stomp.js可能正在对数组做些什么!

现在我正在使用Tracker1的建议jquery的$ .each。

更多信息: http://groups.google.com/group/orbited-users/browse_thread/thread/7fd658cfb166e9fa

数组有问题 http://bayimg.com/fAnhaAaBb

数组没有问题 http://bayimg.com/FaNhEAabb

5 个答案:

答案 0 :(得分:5)

JavaScript for for / in构造传统上用于迭代对象成员名称,而不是数组索引。更具前瞻性的浏览器添加了隐藏属性等功能,以帮助像您期望的方式枚举Array这样的情况,但IE仍然以老派的方式进行,并在您使用时为您提供类似'toString'方法的Object成员/在一个数组上。

indexed-for仍然是规范的JavaScript数组循环。 (虽然你可能的意思是'for( var idx = ...','idx ++'更常见。)

答案 1 :(得分:2)

值得注意的是,诸如prototype.js之类的某些库扩展了Array,因此它们具有超出内部索引的附加属性。正如其他提到的那样,这会破坏x的y符号,IE会迭代属性。对于i = 0 ... i ++是首选。

另外值得注意的是jQuery,原型和其他提供了我真正喜欢的.each(fn)符号。

答案 2 :(得分:1)

我同意@bibince你可能应该使用“for(var i = 0...”语法,但没有理由你选择的语法不起作用,除非你在创建{{1}时做了一些奇怪的事情}}。你是如何初始化你的阵列的?

JavaScript中的数组只是具有特殊自动递增功能的对象,但实际上它们与匿名对象没有太大区别。在Firebug中试试这个:

all_auction_ids

或将其粘贴到IE中的地址栏中,然后按Enter键:

var a = ['a','b','c'];
a.d = 'd';
for(var i in a) console.log(i, a[i]);

修改

我怀疑这是你的问题,但是如果你使用的话,你会遇到同样的问题:

javascript:var a = ['a']; a.d = 'd'; for(var i in a) alert(a[i]); alert(a.length);

而不是

var all_auction_ids = [];

如果这没有用,那么你可以发布一些代码,让我们更好地了解你如何填充var all_auction_ids = new Array(); 吗?

答案 3 :(得分:0)

YUI博客上的

This topic与您的问题密切相关。

答案 4 :(得分:0)

我最近遇到了类似的问题,为复选框列表创建了“全选/全部清除”按钮。在Firefox和Chrome中,它们可以正常工作,但在IE7 / 8中它们没有。我没有使用任何框架或外部库,所有的JavaScript都是我自己的,它是相当简单的东西,并没有太多。我使用getElementsByTagName构建输入元素数组,然后循环遍历:

var allClearInputs = document.getElementsByTagName("input");
for(ac=0;ac<allClearInputs.length;ac=ac+1){
    if(allClearInputs[ac].id){
        var thisNameArr = allClearInputs[ac].id.split("-");
        var thisName = thisNameArr[0];
        if(thisName == checkName){
            if((actionType == 'all' && allClearInputs[ac].checked == false) || (actionType == 'clear' && allClearInputs[ac].checked == true)){
                allClearInputs[ac].click();
            }
        }
    }
}

完美适用于:for(ac = 0; ac&lt; allClearInputs.length; ac = ac + 1){
使用:for(var ac in allClearInputs)

失败