Wenn Sie längere Zeit mit JavaScript gearbeitet haben, wissen Sie, dass Internet Explorer die ECMAScript-Funktion für Array.prototype.indexOf () [einschließlich Internet Explorer 8] nicht implementiert. Dies ist kein großes Problem, da Sie die Funktionalität Ihrer Seite mit dem folgenden Code erweitern können.
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;
}
Wann sollte ich das implementieren?
Sollte ich es auf allen meinen Seiten mit der folgenden Prüfung einschließen, die prüft, ob die Prototypfunktion vorhanden ist, und wenn nicht, den Array-Prototyp erweitern?
if (!Array.prototype.indexOf) {
// Implement function here
}
Oder überprüfen Sie den Browser und implementieren Sie ihn einfach, wenn es sich um Internet Explorer handelt?
//Pseudo-code
if (browser == IE Style Browser) {
// Implement function here
}
javascript
internet-explorer
internet-explorer-8
cross-browser
Bobby Borszich
quelle
quelle
Array.prototype.indexOf
nicht Teil von ECMA-262 / ECMAScript. Siehe ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf Vielleicht denken SieString.prototype.indexOf
...Array.indexOf
berücksichtigt keine negativen Startindizes. Siehe Mozillas Vorschlag Stop-Gap-Implementierung hier: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…Antworten:
Mach es so...
Wie von MDC empfohlen .
Im Allgemeinen ist der Browsererkennungscode ein großes Nein-Nein.
quelle
Alternativ können Sie die inArray-Funktion jQuery 1.2 verwenden , die für alle Browser geeignet ist :
quelle
Der vollständige Code wäre dann:
Eine wirklich gründliche Antwort und einen Code für diese und andere Array-Funktionen finden Sie unter Frage zum Stapelüberlauf. Beheben von JavaScript-Array-Funktionen in Internet Explorer (indexOf, forEach usw.) .
quelle
Die Bibliothek underscore.js verfügt über eine indexOf- Funktion, die Sie stattdessen verwenden können:
quelle
Sie sollten überprüfen, ob es nicht mit definiert ist
if (!Array.prototype.indexOf)
.Auch Ihre Implementierung von
indexOf
ist nicht korrekt. Sie müssen===
statt==
in Ihrerif (this[i] == obj)
Anweisung verwenden, sonst[4,"5"].indexOf(5)
wäre 1 entsprechend Ihrer Implementierung, was falsch ist.Ich empfehle Ihnen, die Implementierung auf MDC zu verwenden .
quelle
Es gibt eine offizielle Mozilla-Lösung: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
quelle
Ich würde dies jedem empfehlen, der nach fehlenden Funktionen sucht:
http://code.google.com/p/ddr-ecma5/
Es bringt die meisten der fehlenden ecma5-Funktionen in ältere Browser ein :)
quelle
Dies war meine Implementierung. Fügen Sie dies im Wesentlichen vor allen anderen Skripten auf der Seite hinzu. dh in Ihrem Master für eine globale Lösung für Internet Explorer 8. Ich habe auch die Trimmfunktion hinzugefügt, die in vielen Frameworks verwendet zu werden scheint.
quelle
Für mich geht das.
quelle
Mit der Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
quelle