странная проблема с IE 7 в JavaScript - PullRequest
4 голосов
/ 21 января 2009

У меня есть этот код 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 ]

5 голосов
/ 21 января 2009

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

Индексированное значение по-прежнему является каноническим циклом массива JavaScript. (Хотя вы, вероятно, имеете в виду «для ( var idx = ...», а «idx ++» встречается чаще).

2 голосов
/ 21 января 2009

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

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

1 голос
/ 21 января 2009

Я согласен с @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);

EDIT:

Я сомневаюсь, что это ваша проблема, но есть ли у вас такая же проблема, если вы используете:

var all_auction_ids = [];

вместо

var all_auction_ids = new Array();

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

0 голосов
/ 04 июня 2010

В последнее время у меня были похожие проблемы с созданием кнопок «выбрать все / очистить все» для списков флажков. В 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)

0 голосов
/ 26 февраля 2009

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

...