wake-up-neo.com

Warum funktioniert indexOf auf einem Array IE8 nicht?

Die folgende Funktion funktioniert einwandfrei unter Opera, Firefox und Chrome. In IE8 schlägt dies jedoch für den Teil if ( allowed.indexOf(ext[1]) == -1) fehl.

Weiß jemand warum? Gibt es einen offensichtlichen Fehler?

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!');
    }
}
291
nLL

Versionen von IE vor IE9 haben keine .indexOf() -Funktion, um die genaue Spezifikationsversion zu definieren Führen Sie dies aus, bevor Sie versuchen, es zu verwenden:

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;
  };
}

Dies ist die Version von MDN , die in Firefox/SpiderMonkey verwendet wird. In anderen Fällen wie dem IE wird .indexOf() hinzugefügt, falls es fehlt ... an dieser Stelle im Grunde IE8 oder niedriger.

486
Nick Craver

Wenn Sie jQuery verwenden, können Sie stattdessen $. InArray () verwenden.

150
tiegz

Wenn Sie jQuery verwenden und indexOf weiterhin verwenden möchten, ohne sich Gedanken über Kompatibilitätsprobleme zu machen, können Sie dies tun:

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

Dies ist hilfreich, wenn Sie weiterhin indexOf verwenden möchten, aber ein Fallback bereitstellen möchten, wenn es nicht verfügbar ist.

17
Mehdiway

Für eine wirklich gründliche Erklärung und Problemumgehung, nicht nur für indexOf, sondern auch für andere Array - Funktionen, die in IE) fehlen, lesen Sie die StackOverflow - Frage Beheben von JavaScript - Array - Funktionen im Internet Explorer (indexOf, forEach, etc .)

10
Luis Perez

Bitte gehen Sie vorsichtig mit $ .inArray um, wenn Sie es verwenden möchten. Ich habe gerade herausgefunden, dass das $ .inArray nur mit "Array" funktioniert, nicht mit String. Deshalb funktioniert diese Funktion im IE8 nicht!

Die jQuery-API sorgt für Verwirrung

Die $ .inArray () -Methode ähnelt der systemeigenen .indexOf () -Methode von JavaScript, da sie -1 zurückgibt, wenn keine Übereinstimmung gefunden wird. Wenn das erste Element im Array mit dem Wert übereinstimmt, gibt $ .inArray () 0 zurück

-> Sie sollten es nicht "Ähnlich" sagen. Da indexOf auch "String" unterstützt!

5
ptgamr

Das Problem

IE <= 8 hat einfach keine indexOf() Methode für Arrays.


Die Lösung

Wenn Sie indexOf in IE <= 8 benötigen, sollten Sie die folgenden Polyfill verwenden, die empfohlen im MDN sind:

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;
    };
}

Minimiert:

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});
3
John Slegers

Sie können diese verwenden, um die Funktion zu ersetzen, wenn sie nicht vorhanden ist:

<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>
1
Bob Cadmire