Domanda

Il sotto funzione funziona bene su Opera, Firefox e Chrome. Tuttavia, in IE8 non riesce da parte if ( allowed.indexOf(ext[1]) == -1).

Qualcuno sa perché? C'è un evidente errore?

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!');
    }
}
È stato utile?

Soluzione

Le versioni di IE prima di IE9 non hanno un .indexOf() funzione per Array, per definire l'esatta versione spec , eseguire questo prima di tentare di usarlo:

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

Questa è la versione da MDN , utilizzato in Firefox / SpiderMonkey. In altri casi, come IE, si aggiungerà .indexOf() nel caso che manca ... fondamentalmente IE8 o al di sotto, a questo punto.

Altri suggerimenti

Se stai usando jQuery, è possibile utilizzare $ .inArray () .

Se stai usando jQuery e desidera continuare a utilizzare indexOf senza preoccuparsi di problemi di compatibilità, si può fare questo:

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

Questo è utile quando si desidera continuare a utilizzare indexOf ma fornire un ripiego quando non è disponibile.

Per una spiegazione molto approfondita e risolvere il problema, non solo per indexOf ma altre funzioni di array mancanti in IE check out la questione StackOverflow Risoluzione funzioni array JavaScript in Internet Explorer (indexOf, forEach, ecc)

Si prega di fare attenzione con $ .inArray se si desidera utilizzarlo. Ho appena scoperto che il $ .inArray è funziona solo con "array", non con stringa. Ecco perché questa funzione non lavorano in IE8!

Il jQuery API make confusione

  

Il metodo $ .inArray () è simile a quello nativo .indexOf di JavaScript ()   metodo che restituisce -1 quando non trova una corrispondenza. Se la   primo elemento all'interno dell'array corrisponde valore, $ .inArray () restituisce 0

-> non dovrebbero dirlo "simile". Dal momento che indexOf sostegno "String" anche!

Il problema

IE <= 8 semplicemente non ha un indexOf() metodo per gli array.


La soluzione

Se avete bisogno di indexOf in IE <= 8, si dovrebbe prendere in considerazione utilizzando il seguente polyfill , che è raccomandato al 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});

È possibile utilizzare questo per sostituire la funzione, se non esiste:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top