2010-03-26 26 views
14

Ich bin ziemlich verwirrt mit dem Verhalten von Arrays von Strings, wenn ich sie durch die jQuery.each()-Methode Schleife. Anscheinend werden die Strings innerhalb der Callback-Funktion zu jQuery-Objekten. Allerdings kann ich die this.get()-Methode nicht verwenden, um die ursprüngliche Zeichenfolge zu erhalten. doing triggert eine this.get ist keine Funktion Fehlermeldung. Ich nehme an, der Grund ist, dass es kein DOM-Knoten ist. Ich kann $(this).get() tun, aber es macht meine Zeichenfolge zu einem Array (von "foo" zu ["f", "o", "o"]).Strings im Array sind keine Strings mehr nach jQuery.each()

Wie kann ich es in String umwandeln? Ich muss eine Variable von String Typ bekommen, weil ich es an andere Funktionen übergebe, die die Werte zwischen ihnen vergleichen.

Ich lege eine in sich geschlossene Testfall (erfordert Firebug-Konsole):

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

Ich habe gerade das gleiche Problem erfahren, jedoch festgestellt, dass dies wie erwartet im strikten Modus funktioniert. – Joost

Antwort

13

bearbeiten/Klärung: Callback-Funktionen nehmen zwei Argumente, der zweite ist der Wert der Variablen. Verwenden Sie es anstelle von this Ich habe beide Varianten getestet und alles scheint wie erwartet zu funktionieren (Zeichenfolgen sind immer noch Zeichenfolgen).

>>> $.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 mein ... Jetzt habe ich es verstanden! –

+2

'this' ist kein jQuery-Objekt beim Durchlaufen von Strings, es umschließt den String in einem' String'-Objekt. Wenn Sie 'this.toString()' tun, erhalten Sie eine reguläre Zeichenfolge. – David

3

Diese in meinem Firefox funktioniert 3.5:

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

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

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

Die Konsole zeigt

string 
string
+0

Hmmm ... Du hast mir eine Idee: 'String (this)' –

+0

@ Álvaro G. Vicario: Klingt gut :) Ich bin so ziemlich ein JavaScript-Noob, also neige ich dazu, den ersten Hack zu verwenden, der funktioniert – balpha