[javascript] 배열 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!');
    }
}



답변

IE9 이전의 IE 버전에는 .indexOf()Array에 대한 기능 이 없으므로 정확한 스펙 버전 을 정의 하려면 사용하기 전에 이것을 실행하십시오.

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 이하입니다.


답변

jQuery를 사용하는 경우 $ .inArray ()를 대신 사용할 수 있습니다 .


답변

당신이 사용하는 경우 jQuery를 하고 호환성 문제에 대한 걱정없이 같이 IndexOf를 계속 사용하려면, 당신은이 작업을 수행 할 수 있습니다 :

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

이 기능은 계속 사용하고 indexOf싶지만 사용할 수없는 경우 대체 기능을 제공 할 때 유용 합니다.


답변

indexOf뿐만 아니라 IE에서 누락 된 다른 배열 함수에 대한 철저한 설명과 해결 방법 은 Internet Explorer에서 StackOverflow 질문 Fixing JavaScript Array 함수 (indexOf, forEach 등)를 확인하십시오.


답변

사용하려면 $ .inArray에주의하십시오. 방금 $ .inArray가 String이 아니라 “Array”에서만 작동한다는 것을 알았습니다. 이것이 IE8에서이 기능이 작동하지 않는 이유입니다!

jQuery API로 혼란

$ .inArray () 메서드는 일치하는 것을 찾지 못하면 -1을 반환한다는 점에서 JavaScript의 기본 .indexOf () 메서드와 유사합니다. 배열 내의 첫 번째 요소가 value와 일치하면 $ .inArray ()는 0을 반환합니다.

-> “Similar”라고 말해서는 안됩니다. indexOf를 지원하기 때문에 “String”도!


답변

문제

IE <= 8에는 단순히 indexOf()배열에 대한 메소드 가 없습니다 .


해결책

indexOfIE <= 8 이 필요한 경우 MDN에서 권장 되는 다음 polyfill 사용을 고려해야 합니다 .

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


답변

존재하지 않는 경우이를 사용하여 함수를 대체 할 수 있습니다.

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