2012-04-14 13 views
2

Ich fing an, eine Todo-Liste mit jQuery Mobile zu erstellen, um es besser zu lernen. Ich höre auf die Ereignisse aus den Tasten eines Menüs wie diese kommen:Stringvergleich gibt false zurück. Seltsames JavaScript-Verhalten mit jQuery mobile. [Code eingeschlossen]

 me.selectedTarget = me.menuNode.find(".ui-btn").first(); 

     me.menuNode.on("click", ".ui-btn", function (e) { 
      var target = $(e.currentTarget) 
       ,targetText = target.text(); 
      console.debug("Click on'", targetText,"'"); 
      if(target === me.selectedTarget) return; 

      if(targetText == "View To Do "){ 
       core.pub("view:todo"); 
      } else if(targetText == "View Done ") { 
       core.pub("view:done"); 
      } else { 
       me.selectedTarget.click(); 
      } 
      me.selectedTarget = target; 
     }); 

Die Variable targetText hat einen extra „“ Raum aus irgendeinem Grunde am Ende. Ich habe 3 Tasten, aber die dritte ist ein bisschen speziell - nicht relevant -.

the buttons that this code listens to.

Mein Problem ist, dass ich auf der letzten else-Klausel immer bin immer. targetText wird niemals mit "View To Do" oder "View Done" gleichgesetzt.

Warum ist "View Done" nicht = = "View Done"? ~ X (

firebug debugging results

the html markup

+1

Meine Vermutung ist, dass der nachstehende Leerzeichen fehlt, warum nicht $ .trim ("View Done") == $ .trim ("View Done")? Ihre Zeichenfolge hat möglicherweise ein \ t \ r oder \ n erhalten, das als Leerzeichen im Dubugger angezeigt wird. –

+2

Vielleicht hilft '$ .trim'. Entfernen Sie extra 'Leerzeichen' aus Zeichenfolgenliteralen und trimmen Sie 'targetText'->' $ .trim (targetText) == "View Done" ' – Engineer

+0

Ich wusste nicht, dass es in jQuery eine Trimmung gab: O –

Antwort

7

Der Vergleich wird scheitern, weil die Saiten nicht gleich sind. Also wirklich die Frage ist warum sind sie nicht das gleiche? Anscheinend ist der Raum in einem der Zeichenfolgen ist nicht das Standard-Leerzeichen (Unicode hat mehr als ein Leerzeichen), oder eine der Zeichenfolgen hat ein unsichtbares Zeichen (Unicode hat auch diese)

Also um herauszufinden, was vor sich geht, würde ich tun Sie dies:

var index; 
for (index = 0; index < targetText.length; ++index) { 
    console.log("char " + index + ": " + targetText.charCodeAt(index)); 
} 

... und das gleiche mit Ihrem String-Literal in Ihrem Code (nicht erneut eingeben, sondern in ein lokales übertragen und dann ausgeben; da, wenn Sie es erneut eingeben, Sie wahrscheinlich den normalen Raum eingeben). Vergleichen Sie die Sequenzen der Zeichencodes und Sie werden die Diskrepanz finden.

+1

der Trimmvorschlag hat den Job für mich erledigt. Ich denke, ich sollte bedenken, dass zwei Dinge, die gleich aussehen, unterschiedliche Darstellungen haben können. –

+0

@VladNicula: In der Tat können sie. :-) Ich wäre neugierig zu wissen, was nicht-Leerzeichen Whitespace Sie dort hatten ... –

+0

Ich fügte einen Screenshot des HTML. Dort ist kein Platz sichtbar. Ich erinnere mich jedoch daran, die ersten beiden Links aus den jQuery-Dokumenten kopiert zu haben. Vielleicht hat copy + paste etwas hinter den Kulissen hinzugefügt, da der .text() den zusätzlichen Platz zurückgegeben hat. –