Почему indexOf не работает с массивом IE8? - PullRequest
291 голосов
/ 02 сентября 2010

Следующая функция прекрасно работает на Opera, Firefox и Chrome. Тем не менее, в IE8 происходит сбой на if ( allowed.indexOf(ext[1]) == -1) части.

Кто-нибудь знает почему? Есть ли очевидная ошибка?

function CheckMe() {
    var allowed = new Array('docx','xls','xlsx', 'mp3', 'mp4', '3gp', 'sis', 'sisx', 'mp3', 'wav', 'mid', 'amr', 'jpg', 'gif', 'png', 'jpeg', 'txt', 'pdf', 'doc', 'rtf', 'thm', 'rar', 'zip', 'htm', 'html', 'css', 'swf', 'jar', 'nth', 'aac', 'cab', 'wgz');
    var fileinput=document.getElementById('f');
    var ext = fileinput.value.toLowerCase().split('.');
    if ( allowed.indexOf(ext[1]) == -1) 
    {
        document.getElementById('uploadsec').innerHTML = document.getElementById('uploadsec').innerHTML;
        alert('This file type is not allowed!');
    }
}

Ответы [ 7 ]

485 голосов
/ 02 сентября 2010

Версии IE до IE9 не имеют функции .indexOf() для массива, чтобы определить точную версию спецификации , запустите ее перед попыткой ее использования:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

Это версия из MDN , используемая в Firefox / SpiderMonkey.В других случаях, таких как IE, он добавит .indexOf() в случае, если его не хватает ... в основном IE8 или ниже.

150 голосов
/ 18 января 2012

Если вы используете jQuery, вы можете использовать $. InArray () .

16 голосов
/ 28 февраля 2014

Если вы используете jQuery и хотите продолжать использовать indexOf, не беспокоясь о проблемах совместимости, вы можете сделать это:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(val) {
        return jQuery.inArray(val, this);
    };
}

Это полезно, если вы хотите продолжать использоватьindexOf но предоставьте запасной вариант, когда он недоступен.

9 голосов
/ 11 января 2012

Для действительно подробного объяснения и обходного пути не только для indexOf, но и для других функций массива, отсутствующих в IE, проверьте вопрос StackOverflow Исправление функций JavaScript Array в Internet Explorer (indexOf, forEach и т. Д.)

5 голосов
/ 04 сентября 2013

Пожалуйста, будьте осторожны с $ .inArray, если хотите его использовать. Я только что узнал, что $ .inArray работает только с "Array", а не со String. Вот почему эта функция не будет работать в IE8!

API jQuery создает путаницу

Метод $ .inArray () похож на родной JavaScript .indexOf () метод в том, что он возвращает -1, когда не находит соответствия. Если первый элемент в массиве соответствует значению, $ .inArray () возвращает 0

-> Они не должны говорить «похоже». Так как indexOf поддержки "String" также!

3 голосов
/ 21 февраля 2016

Проблема

IE <= 8 просто не имеет <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf" rel="nofollow">indexOf() метода для массивов.


Решение

Если вам нужно indexOf в IE <= 8, вам следует рассмотреть возможность использования следующего <a href="https://remysharp.com/2010/10/08/what-is-a-polyfill" rel="nofollow"> polyfill , который рекомендуется при MDN :

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement, fromIndex) {
        var k;
        if (this == null) {
            throw new TypeError('"this" is null or not defined');
        }
        var o = Object(this);
        var len = o.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = +fromIndex || 0;
        if (Math.abs(n) === Infinity) {
            n = 0;
        }
        if (n >= len) {
            return -1;
        }
        k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
        while (k < len) {
            if (k in o && o[k] === searchElement) {
                return k;
            }
            k++;
        }
        return -1;
    };
}

Minified:

Array.prototype.indexOf||(Array.prototype.indexOf=function(r,t){var n;if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),i=e.length>>>0;if(0===i)return-1;var a=+t||0;if(Math.abs(a)===1/0&&(a=0),a>=i)return-1;for(n=Math.max(a>=0?a:i-Math.abs(a),0);i>n;){if(n in e&&e[n]===r)return n;n++}return-1});
1 голос
/ 23 февраля 2015

Вы можете использовать это для замены функции, если она не существует:

<script>
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(elt /*, from*/) {
        var len = this.length >>> 0;

        var from = Number(arguments[1]) || 0;
        from = (from < 0) ? Math.ceil(from) : Math.floor(from);
        if (from < 0)
            from += len;

        for (; from < len; from++) {
            if (from in this && this[from] === elt)
                return from;
        }
        return -1;
    };
}
</script>
...