以下の機能は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()
関数がなく、定義するために 正確な仕様バージョン があり、使用する前にこれを実行します。
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にない他の配列関数について、StackOverflowの質問 をご覧ください。InternetExplorerでのJavaScript配列関数の修正(indexOf、forEachなど)
使用する場合は、$。inArrayに注意してください。 $ .inArrayはStringではなく「Array」でのみ機能することがわかりました。そのため、この関数はIE8では機能しません!
JQuery APIは混乱を招きます
$ .inArray()メソッドは、一致するものが見つからない場合に-1を返すという点でJavaScriptのネイティブ.indexOf()メソッドに似ています。配列内の最初の要素が値と一致する場合、$。inArray()は0を返します
->彼らはそれを「似ている」と言ってはいけません。 indexOfは「String」もサポートしているので!
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});
存在しない場合は、これを使用して関数を置き換えることができます。
<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>