javascript - repetidos - ¿Por qué no funciona indexOf en un array IE8?
javascript indexof array of objects (7)
El problema
IE <= 8 simplemente no tiene un método .indexOf() para los arreglos.
La solución
Si necesita indexOf
en IE <= 8, debe considerar el uso del siguiente polyfill , que se .indexOf() :
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;
};
}
Minificado
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});
La siguiente función funciona bien en Opera, Firefox y Chrome. Sin embargo, en IE8 falla en la parte if ( allowed.indexOf(ext[1]) == -1)
.
¿Alguien sabe por qué? ¿Hay algún error obvio?
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!'');
}
}
Las versiones de IE antes de IE9 no tienen una función .indexOf()
para Array, para definir la versión de la especificación exacta , ejecute esto antes de intentar usarla:
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;
};
}
Esta es la versión de MDN , utilizada en Firefox / SpiderMonkey. En otros casos, como IE, agregará .indexOf()
en el caso de que falte ... básicamente IE8 o inferior en este punto.
Para obtener una explicación y solución realmente completas, no solo para indexOf sino también para otras funciones de matriz que faltan en IE, consulte la pregunta de Corrección de funciones de matriz de JavaScript en Internet Explorer (indexOf, forEach, etc.)
Por favor tenga cuidado con $ .inArray si quiere usarlo. Acabo de descubrir que $ .inArray solo funciona con "Array", no con String. Es por eso que esta función no funcionará en IE8!
La API de jQuery crea confusión.
El método $ .inArray () es similar al método nativo .indexOf () de JavaScript en que devuelve -1 cuando no encuentra una coincidencia. Si el primer elemento dentro de la matriz coincide con el valor, $ .inArray () devuelve 0
-> No deberían decirlo "Similar". Desde indexOf soporte "String" también!
Puedes usar esto para reemplazar la función si no existe:
<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>
Si está usando jQuery, puede usar $.inArray() lugar.
Si está utilizando jQuery y desea seguir usando indexOf sin preocuparse por los problemas de compatibilidad, puede hacer esto:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(val) {
return jQuery.inArray(val, this);
};
}
Esto es útil cuando desea seguir utilizando indexOf
pero proporciona un respaldo cuando no está disponible.