Странная проблема с IE 7 в JavaScript

У меня есть этот код JavaScript, работающий в Firefox, Chrome и Safari

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's $.each.

дополнительная информация: http://groups.google.com/group/orbited-users/browse_thread/thread/7fd658cfb166e9fa

массив с проблемой http://bayimg.com/fAnhaAaBb

массив без проблем http://bayimg.com/FaNhEAabb

5 ответов

Конструкция JavaScript for/in традиционно предназначена для итерации по именам членов объекта, а не по индексам массива. Более дальновидные браузеры добавили функции, такие как скрытые свойства, чтобы помочь случаям, таким как Array, перечислять так, как вы ожидаете, но IE по-прежнему делает это старомодным способом и предоставляет вам элементы Object, такие как метод toString, когда вы используете для / в массиве.

Индексированный для все еще является каноническим циклом массива JavaScript. (Хотя вы, вероятно, имеете в виду "for (var idx =...", а "idx++" встречается чаще).

Стоит отметить, что некоторые библиотеки, такие как prototype.js, расширяют Array, так что они имеют дополнительные свойства помимо внутренних индексов. Это нарушает обозначение x в y, за исключением, как уже упоминалось, IE будет повторять свойства. для i=0...i++ является предпочтительным.

Также стоит отметить, что jQuery, prototype и другие предлагают нотацию.each(fn), которую я на самом деле предпочитаю.

Я согласен с @bibince, что вы, вероятно, должны использовать "for(var i = 0..."синтаксис, но нет причины, по которой выбранный вами синтаксис не должен работать, если вы не сделали что-то странное в своем создании all_auction_ids, Как вы инициализируете свой массив?

Массивы в JavaScript - это просто объекты со специальной функцией автоинкремента, но в действительности они не сильно отличаются от анонимных объектов. Попробуйте это в Firebug:

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

или вставьте это в адресную строку в IE и нажмите Enter:

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();

Если это не поможет, не могли бы вы опубликовать немного больше своего кода, чтобы дать нам лучшее представление о том, как вы заполняете all_auction_ids?

У меня были подобные проблемы в последнее время при создании кнопок "выбрать все / очистить все" для списков флажков. В 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Сбои с треском: for(var ac в allClearInputs)

Эта тема в блоге YUI имеет отношение к вашей проблеме.

Другие вопросы по тегам