Если вы когда-либо работали с JavaScript, вам известно, что Internet Explorer не реализует функцию ECMAScript для Array.prototype.indexOf () [включая Internet Explorer 8]. Это не большая проблема, потому что вы можете расширить функциональность на своей странице с помощью следующего кода.
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;
}
Когда я должен реализовать это?
Должен ли я обернуть его на всех своих страницах с помощью следующей проверки, которая проверяет, существует ли функция прототипа, и если нет, продолжайте и расширять прототип Array?
if (!Array.prototype.indexOf) {
// Implement function here
}
Или проверить браузер, и если это Internet Explorer, то просто реализовать его?
//Pseudo-code
if (browser == IE Style Browser) {
// Implement function here
}
javascript
internet-explorer
internet-explorer-8
cross-browser
Бобби Борщич
источник
источник
Array.prototype.indexOf
не является частью ECMA-262 / ECMAScript. См. Ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf Может быть, вы думаетеString.prototype.indexOf
...Array.indexOf
не учитывает отрицательные стартовые индексы. Посмотрите на предложенную MozillaОтветы:
Делай это так...
Как рекомендуется совместимость с MDC .
В общем, код обнаружения браузера - большой нет-нет.
источник
В качестве альтернативы вы можете использовать функцию jQuery 1.2 inArray , которая должна работать в разных браузерах:
источник
Полный код будет таким:
Для действительно подробного ответа и кода на этот вопрос, а также на другие функции массива, проверьте вопрос переполнения стека Исправление функций массива JavaScript в Internet Explorer (indexOf, forEach и т . Д.) .
источник
Библиотека underscore.js имеет функцию indexOf, которую вы можете использовать вместо:
источник
Вы должны проверить, если это не определено с помощью
if (!Array.prototype.indexOf)
.Кроме того, ваша реализация
indexOf
не является правильной. Вы должны использовать===
вместо==
в своемif (this[i] == obj)
заявлении, иначе[4,"5"].indexOf(5)
будет 1 в соответствии с вашей реализацией, что неверно.Я рекомендую вам использовать реализацию на MDC .
источник
Существует официальное решение Mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
источник
Я бы порекомендовал это всем, кто ищет недостающую функциональность:
http://code.google.com/p/ddr-ecma5/
Это приносит большую часть недостающей функциональности ecma5 для старых браузеров :)
источник
Это была моя реализация. По сути, добавьте это перед любыми другими скриптами на странице. то есть в вашем мастере для глобального решения для Internet Explorer 8. Я также добавил функцию обрезки, которая, кажется, используется во многих фреймворках.
источник
меня устраивает.
источник
С Underscore.js
var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })
источник