web-dev-qa-db-ja.com

配列IE8でindexOfが機能しないのはなぜですか?

以下の機能は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!');
    }
}
291
nLL

IE9より前のIEのバージョンには、配列用の .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;
  };
}

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

485
Nick Craver

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

150
tiegz

jQueryを使用していて、互換性の問題を心配せずにindexOfを使い続けたい場合は、次のようにします。

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

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

16
Mehdiway

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

9
Luis Perez

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

JQuery APIは混乱を招きます

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

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

5
ptgamr

問題

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


ソリューション

IE <= 8でindexOfが必要な場合、次の 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;
    };
}

最小化:

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

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

<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