2010-04-09 13 views
16

Tengo el siguiente código:jQuery split() y los resultados indexOf en "objeto no admite esta propiedad o método"

var selected = $('#hiddenField').val().split(","); 
... 
if (selected.indexOf(id) > 0) { 
    ... set value ... 
} 

estoy creando dinámicamente un CheckBoxList, y tratando de recordar el estado de las casillas de verificación al colocar los ID seleccionados en el campo oculto.

Aparece un error que indica que "El objeto no admite esta propiedad o método". Mi suposición es que selected es una matriz, que debería ser compatible con indexOf. Es eso incorrecto?

+1

Solo como sugerencia, estos son métodos normales de ** Javascript **, no son específicos de jQuery. –

+0

Probablemente sería útil publicar más código. Además, debes verificar que lo que * piensas * que estás saliendo de ese campo oculto es realmente lo que hay en él. – Pointy

+0

@Felix: No estaba seguro de si había una diferencia entre la división incorporada y la división de jquery. – chris

Respuesta

21

Según su mensaje de error, asumo que esto proviene de Internet Explorer.

¡Sorpresa! Internet Explorer (incluida la versión 8) no es compatible con indexOf para matrices.

Aquí es Firefox's implementation puede utilizar:

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

@Matt: Gracias. Pensé que lo habían implementado en IE8, así que fuimos e hicimos un experimento rápido, y nos sorprendió gratamente verlo en IE7 también. Como puede adivinar, el experimento fue defectuoso (olvidé eliminar la referencia a Prototype, que convenientemente lo agrega si falta). Gracias de nuevo. –

0
[].indexOf || (Array.prototype.indexOf = function(v,n){ 
    n = (n==null)?0:n; var m = this.length; 
    for(var i = n; i < m; i++) 
    if(this[i] == v) 
     return i; 
    return -1; 
}); 
22

Hay un método jQuery para superar la falta de indexOf(), puede utilizar .inArray() lugar:

var selected = $('#hiddenField').val().split(","); 
if ($.inArray(id, selected) > -1) { 
    ... set value ... 
} 

jQuery.inArray() existe sólo para este razón ... si ya incluye jQuery, no es necesario volver a escribir la función. Nota: Esto realmente devuelve un número, como indexOf().

+0

+1 parece ser la respuesta más razonable :) –

+0

Parece que debería funcionar, por alguna razón no es: >? line.id >? seleccionado {...} [0]: "101" longitud: 1 >? $ .inArray (line.id, seleccionado) -1 > – chris

Cuestiones relacionadas