2013-04-24 13 views
26

Stworzyłem ten mały oddziaływanie na jednej z platform w pracy - http://jsfiddle.net/S79qp/426/jQuery - .forEach() nie pracuje w IE8

To działa dobrze we wszystkich przeglądarkach oprócz utworzenia IE8. Kiedy uruchomić konsolę wydaje się, że ten rozdział jest mający problemy z ...

Array.prototype.forEach.call(l, function(item) { 
     a.push(jQuery(item).text()); 
    }); 

Może ktoś mi pokazać przyjazną alternatywę IE8, więc mogę zrobić to zgodne z wersjami wymagane?

+1

dlaczego nie użyć jQuery zamiast prototypu –

+2

@Sarfaraz: "Prototype" w tym przypadku nie jest biblioteką, ale słowem kluczowym w JavaScript. – Guffa

+1

@Sarfaraz Co jest złego w korzystaniu z prototypu? – rickyduck

Odpowiedz

35

Użyj jQuery.each method:

jQuery.each(l, function(index, item){ 
    a.push(jQuery(item).text()); 
}); 

Jeśli tablica docelowa jest pusta od początku, można użyć jQuery.map method za to w zamian:

var a = jQuery.map(l, function(item){ 
    return jQuery(item).text(); 
}); 
+0

Teraz konsola mówi, że nie obsługuje indeksu = a.indexOf (current) + 1; if (index <0 || index> = l.length) { index = 0; @Guffa } –

+0

@ Milo-J: "Array.indexOf" to kolejna ostatnio dodana metoda. Zamiast tego należy użyć metody 'jQuery.inArray'. http://api.jquery.com/jQuery.inArray/ – Guffa

+0

Próbowałem to zrobić, ale to nie zadziała. czy mógłbyś rzucić okiem? http://jsfiddle.net/S79qp/428/ @Guffa –

2

istocie metoda forEach jest dostępny tylko z IE9. Powinieneś użyć wersji jQuery "each()", aby zaoferować wsparcie dla starszych przeglądarek.

41

Jeśli chcesz to forEach() w IE8:

if (typeof Array.prototype.forEach != 'function') { 
    Array.prototype.forEach = function(callback){ 
     for (var i = 0; i < this.length; i++){ 
     callback.apply(this, [this[i], i, this]); 
     } 
    }; 
} 

To będzie zachowywać as expected w dowolnej przeglądarce, która nie ma również wbudowane.

+3

Głosowanie nad tym, kiedy przychodzi do projektu na dużą skalę, czasami jest łatwiejsze i bezpieczniejsze, aby pomóc poprawić wadliwą przeglądarkę, zamiast próbować poprawić kod, który w rzeczywistości nie jest wadliwy. – Mayhem

+1

To jest genialne! – Anant

+0

Byłoby lepiej użyć polyfill pod podanym linkiem. Ten kod został udoskonalony. –

2

forEach nie jest obsługiwana w IE 8, zamiast tego można użyć zwykłej pętli:

for (var i = 0; i < myArray.length; i++) { 
    // code 
} 
1

miałem ten sam problem z IE8 i oto jak ja go rozwiązać!

Przede wszystkim chciałem zapętlić i uzyskać dane z obiektu JSON array. Take wygląd oryginału, który działa dobrze w FIREX, chrom i najnowszy IE, ale nie IE8

  data.children.forEach(function(item) { 
 
       //javascript: console.log(item); 
 
       console.log(data.children); 
 
       attachRel(item, '1' + (data.children.length > 1 ? 1 : 0)); 
 
      });

Oto rozwiązanie, które opracowałem po długim dniu walki

  $.each(data.children, function() { 
 

 
       attachRel(this, '1' + (data.children.length > 1 ? 1 : 0)); 
 
      });