2010-03-26 22 views
14

Estoy bastante confundido con el comportamiento de las matrices de cadenas cuando las bucleo a través del método jQuery.each(). Aparentemente, las cadenas se convierten en objetos jQuery dentro de la función de devolución de llamada. Sin embargo, no puedo usar el método this.get() para obtener la cadena original; al hacerlo se desencadena un this.get no es una función mensaje de error. Supongo que la razón es que no es un nodo DOM. Puedo hacer $(this).get() pero hace que mi cadena se convierta en una matriz (desde "foo" hasta ["f", "o", "o"]).Las cadenas en la matriz ya no son cadenas después de jQuery.each()

¿Cómo puedo devolverlo a la cadena? Necesito obtener una variable del tipo String porque la paso a otras funciones que comparan los valores entre ellas.

Adjunto un caso de prueba autónomo (requiere consola de Firebug):

<!DOCTYPE html> 
<html> 
<head><title></title> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script type="text/javascript"><!-- 
$(function(){ 
    var foo = []; 
    var $foo = $(foo); 

    foo.push("987"); 
    $foo.push("987"); 

    foo.push("654"); 
    $foo.push("654"); 

    $.each(foo, function(i){ 
     console.log("foo[%d]: object=%o; value=%s; string=%o", i, this, this, $(this).get()); // this.get() does not exist 
    }); 
    $foo.each(function(i){ 
     console.log("$foo[%d]: object=%o; value=%s; string=%o", i, this, this, $(this).get()); // this.get() does not exist 
    }); 
}); 
//--></script> 
</head> 
<body> 

</body> 
</html> 
+1

Acabo de experimentar el mismo problema, sin embargo descubrí que esto funciona como se espera en modo estricto. – Joost

Respuesta

13

edición/clarification: calllback functions toma dos argumentos, el segundo es el valor de la variable. Úselo en lugar de this He probado ambas variantes y todo parece funcionar como se esperaba (las cadenas todavía son cadenas).

>>> $.each(['foo','bar'], function(i, s){ console.info(s, typeof s) }) 
foo string 
bar string 

>>> $(['foo','bar']).each(function(i, s){ console.info(s, typeof s) }) 
foo string 
bar string 
+0

Oh my ... ¡Ahora lo entiendo! –

+2

'this' no es un objeto jQuery al alternar entre cadenas, envuelve la cadena en un objeto' String'. Si haces 'this.toString()' obtendrás una cadena regular. – David

3

Esto funciona en mi Firefox 3.5:

$(function(){ 
    var foo = []; 

    foo.push("abc"); 
    foo.push("def"); 

    $.each(foo, function(i){ 
     console.log(typeof ("" + this)); 
     }); 
}); 

La consola muestra

string 
string
+0

Hmmm ... Me diste una idea: 'String (this)' –

+0

@ Álvaro G. Vicario: Suena bien :) Soy más o menos un novato de JavaScript, así que tiendo a usar el primer truco que funciona – balpha

Cuestiones relacionadas