Странная проблема с 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