Jeśli pracujesz z JavaScriptem na dowolnej długości, wiesz, że Internet Explorer nie implementuje funkcji ECMAScript dla Array.prototype.indexOf () [w tym Internet Explorer 8]. Nie jest to duży problem, ponieważ możesz rozszerzyć funkcjonalność swojej strony o następujący kod.
Array.prototype.indexOf = function(obj, start) {
for (var i = (start || 0), j = this.length; i < j; i++) {
if (this[i] === obj) { return i; }
}
return -1;
}
Kiedy powinienem to wdrożyć?
Czy powinienem owinąć go na wszystkich moich stronach następującym sprawdzeniem, które sprawdza, czy funkcja prototypu istnieje, a jeśli nie, śmiało i rozszerzać prototyp Array?
if (!Array.prototype.indexOf) {
// Implement function here
}
A może przeglądarka sprawdza, a jeśli jest to Internet Explorer, to po prostu go wdrażasz?
//Pseudo-code
if (browser == IE Style Browser) {
// Implement function here
}
javascript
internet-explorer
internet-explorer-8
cross-browser
Bobby Borszich
źródło
źródło
Array.prototype.indexOf
nie jest częścią ECMA-262 / ECMAScript. Zobacz ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf Może myśliszString.prototype.indexOf
...Array.indexOf
nie bierze pod uwagę ujemnych wskaźników początkowych. Zobacz sugestię Mozilli dotyczącą zatrzymania luki tutaj: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…Odpowiedzi:
Zrób to tak ...
Zgodnie z zalecaną kompatybilnością przez MDC .
Ogólnie rzecz biorąc, kod wykrywający w przeglądarce jest dużym nie-nie.
źródło
Alternatywnie możesz użyć funkcji inArray jQuery 1.2 , która powinna działać w różnych przeglądarkach:
źródło
Pełny kod byłby więc następujący:
Aby uzyskać naprawdę dokładną odpowiedź i kod na to, a także inne funkcje tablicowe, sprawdź pytanie Przepełnienie stosu Naprawianie funkcji tablicy JavaScript w Internet Explorerze (indexOf, forEach itp . ) .
źródło
Biblioteka underscore.js ma funkcję indexOf, której można zamiast tego użyć:
źródło
Powinieneś sprawdzić, czy nie jest zdefiniowane za pomocą
if (!Array.prototype.indexOf)
.Ponadto implementacja
indexOf
jest niepoprawna. Musisz użyć===
zamiast==
w swoimif (this[i] == obj)
oświadczeniu, w przeciwnym razie[4,"5"].indexOf(5)
byłoby 1 zgodnie z implementacją, co jest niepoprawne.Polecam użycie implementacji na MDC .
źródło
Istnieje oficjalne rozwiązanie Mozilli: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
źródło
Poleciłbym to każdemu, kto szuka brakującej funkcjonalności:
http://code.google.com/p/ddr-ecma5/
Wnosi większość brakujących funkcji ecma5 do starszych przeglądarek :)
źródło
To była moja realizacja. Zasadniczo dodaj to przed innymi skryptami na stronie. tj. w twoim master dla globalnego rozwiązania dla Internet Explorera 8. Dodałem również funkcję przycinania, która wydaje się być używana w wielu ramach.
źródło
mi to pasuje.
źródło
Z Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
źródło