2012-04-09 8 views
2

Ich habe ein Webformular, das die Checkboxen beim Laden der Seite automatisch anhand der in der MYSQL-Datenbank gespeicherten Daten überprüft. Alles funktioniert gut mit Ausnahme von Daten, die einen Apostroph enthalten. Hier ist mein Code:Warum kann mein jQuery-Code kein Apostroph lesen?

JSON:

[{"pkFavorietemerken":"1","merken":"Adidas"},{"pkFavorietemerken":"2","merken":"Boss"},{"pkFavorietemerken":"3","merken":"Burberry"},{"pkFavorietemerken":"4","merken":"Christian Dior"},{"pkFavorietemerken":"5","merken":"D&G"},{"pkFavorietemerken":"6","merken":"Diesel"},{"pkFavorietemerken":"7","merken":"Dolce & Gabanna"},{"pkFavorietemerken":"8","merken":"Emporio Armani"}] 

JQUERY:

$.getJSON("jason.php", function(data) { 

     $.each(data, function(){ 


    $("[value='" + this.merken + "']").attr("checked","checked"); 


     }); 

    }); 

HTML:

<form name="form1" method="post" action="something.php">       
    <ul> 
     <li><input type="checkbox" name="merk[]" value="Adidas"/>Adidas</li> 
     <li><input type="checkbox" name="merk[]" value="Airforce"/>Airforce</li> 
     <li><input type="checkbox" name="merk[]" value="Armani"/>Armani</li> 
     <li><input type="checkbox" name="merk[]" value="Asics"/>Asics</li> 
     <li><input type="checkbox" name="merk[]" value="Bikkemberg"/>Bikkemberg</li> 
     <li><input type="checkbox" name="merk[]" value="Bjorn Borg"/>Bjorn Borg</li> 
     <li><input type="checkbox" name="merk[]" value="BlueBlood"/>BlueBlood</li> 
     <li><input type="checkbox" name="merk[]" value="Boss"/>Boss</li> 
     <li><input type="checkbox" name="merk[]" value="Brunotti"/>Brunotti</li> 
     <li><input type="checkbox" name="merk[]" value="Burberry"/>Burberry</li> 
    </ul> 

funktioniert das nicht:

<li><input type="checkbox" name="merk[]" value="Levi's"/>Levi's</li> 
+0

, das zu tun nicht –

Antwort

3

Für Levi's lautet der resultierende Selektor "[value='Levi's']". Ich schätze, der Wählmotor drosselt darauf. Ich bin mir nicht sicher, ob es zu entkommen unterstützt (Levi\'s) - wenn dies nicht der Fall, können Sie so etwas wie

var merken = this.merken; 
$("input:checkbox").each(function(){ 
    if(this.value == merken) this.checked = true; 
}); 

stattdessen tun können.

+0

Ich habe es getestet und es funktioniert! Ich bin ein bisschen neu bei jQuery, um klar zu machen, was dein Code tut. Der Code überprüft alle Eingabe-Checkboxen, um zu sehen, ob der Wert in der Liste ist, und wenn ja, prüft er das Kontrollkästchen auf "True"? –

+0

Ja, es durchläuft alle Kontrollkästchen und vergleicht den Wert, den Sie vom JSON erhalten haben, mit dem Wert jeder Checkbox. Wenn sie übereinstimmen, wird das Attribut 'checked' für dieses Kontrollkästchen gesetzt. – AKX

1

Nun, Sie durch Umwickeln Sie den Wert in einfache Anführungszeichen einen Selektor bilden. Das eingebettete einfache Anführungszeichen wird dazu führen, dass es eine ungültige Auswahlzeichenfolge ist.

I denke, es wird funktionieren, um sicherzustellen, dass eingebettete einfache Anführungszeichen mit einem umgekehrten Schrägstrich zitiert werden, aber ich muss es versuchen.

bearbeiten — versuchen Sie dies:

$("[value='" + this.merken.replace(/'/g, "\\'") + "']").attr("checked","checked"); 

Außerdem sollten Sie (fast sicher) .prop() statt .attr() verwendet werden, die festlegen Eigenschaft „geprüft“, wenn Sie ein mit neueren-als-1.6 jQuery:

$("[value='" + this.merken.replace(/'/g, "\\'") + "']").prop("checked", true); 

(Keine Notwendigkeit, das Eigentum an den String „geprüft“ zu setzen, wenn Sie können, wenn Sie mögen, weil der Browser es nur gegossen wird sowieso boolean.)

+0

funktioniert, warum ist es wichtig, zu verwenden '.prop()' statt '.attr()', wenn 1.6 und höher verwendet? –

+0

Es gibt einen Unterschied zwischen Eigenschaften von DOM-Elementen (Dinge, auf die Sie mit Namen zugreifen können, als wären die DOM-Elemente JavaScript-Objekte; 'somthing.name' oder' something.tagName' oder 'something.onclick' usw.). Die jQuery - Leute haben die Entscheidung getroffen, klar zwischen den beiden in 1.6 zu unterscheiden. In fast allen Fällen wollen Sie nun '.prop()' verwenden, es sei denn, Sie ** wissen **, dass Sie über die Attribut - API der DOM-Element – Pointy

3
$("[value='" + this.merken + "']").attr("checked","checked"); 

Wenn this.merken = "Levi's", wird der Code auf dieses Problem zu beheben:

$("[value='Levi's']").attr("checked","checked"); 

Sie können nicht ein einziges Zitat in einfache Anführungszeichen verwenden. Eine einfache Lösung soll Ihren Code zu ändern sein, um doppelte Anführungszeichen, so lange zu erstellen, wie Sie keinen Wähler Levi"s :)

genannt haben
$('[value="' + this.merken + '"]').attr("checked","checked"); 
+0

Ich habe das getestet und es funktioniert auch! Haha Ich glaube nicht, dass ich einen Eingabewert wie "Levi" haben werde. Gibt es bei der Verwendung dieser Methode andere Sonderzeichen, die ich vermeiden sollte? –

0

Das richtige Stück Code sein sollte:

$('[value="' + this.merken.replace('"','\"') + '"]').attr("checked","checked"); 

Dies akzeptiert sowohl einfache Anführungszeichen als auch doppelte Anführungszeichen.

0

Das Problem ist der Apostroph, Sie müssen ihm entkommen.

Hier ist eine einfach Art und Weise so

function addslashes(str) { 
    return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0"); 
} 
$("[value='" + addslashes(this.merken) + "']").attr("checked","checked");