294

以下の関数は、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!');
    }
}
4

7 に答える 7

488

.indexOf()IE9より前のバージョンのIEには、配列の関数がありません。正確な仕様バージョンを定義するには、使用する前にこれを実行してください。

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

これは、 Firefox/SpiderMonkeyで使用されているMDNのバージョンです。IEなどの他のケースでは.indexOf()、欠落している場合に追加されます...基本的にこの時点でIE8以下です。

于 2010-09-02T16:38:12.473 に答える
153

jQueryを使用している場合は、代わりに$ .inArray()を使用できます。

于 2012-01-18T16:56:56.947 に答える
17

jQueryを使用していて、互換性の問題を気にせずにindexOfを使い続けたい場合は、次のようにすることができます。

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

これは、使い続けたいときに役立ちますindexOfが、使用できない場合はフォールバックを提供します。

于 2014-02-28T18:03:47.110 に答える
10

本当に徹底的な説明と回避策については、indexOfだけでなく、IEにない他の配列関数については、StackOverflowの質問をチェックしてください。InternetExplorerでのJavaScript配列関数の修正(indexOf、forEachなど)

于 2012-01-11T02:40:43.630 に答える
5

$ .inArrayを使用する場合は、注意してください。$ .inArrayは「Array」でのみ機能し、Stringでは機能しないことがわかりました。そのため、この関数はIE8では機能しません。

jQueryAPIは混乱を招きます

$ .inArray()メソッドは、一致するものが見つからない場合に-1を返すという点で、JavaScriptのネイティブ.indexOf()メソッドに似ています。配列内の最初の要素が値と一致する場合、$。inArray()は0を返します

->彼らはそれを「似ている」と言うべきではありません。indexOfは「String」もサポートしているので!

于 2013-09-04T08:24:10.607 に答える
3

問題

IE <= 8にはindexOf()、配列のメソッドがありません。


ソリューション

indexOfIE <= 8で必要な場合は、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;
    };
}

縮小:

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});
于 2016-02-21T17:43:45.770 に答える
1

関数が存在しない場合は、これを使用して関数を置き換えることができます。

<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>
于 2015-02-23T17:22:18.740 に答える