Rolf B: String-Problem mit dem Zeichen '

Beitrag lesen

Hallo Linuchs,

wie gesagt - die Implementierung der Funktion getMitgliederInteressentenPut ist unschuldig. Das brauchen wir nicht.

Das Syntaxhighlighting zeigt das Problem. Und Du hättest den Screenshot nicht im Inspektor, sondern im DOM machen sollen. Aus dem Screenshot errate ich, dass Du im PHP mutmaßlich <a href='javascript...'> verwendest und nicht, wie der Inspektor behauptet, <a href="javascript...">

Das einzelne Apostroph beendet dann das Attribut und dadurch geht der Rest in die Binsen. Oder den Strandhafer.

Aus der Hüfte geschossen: Behandle im PHP den href-String mit

htmlentities(str_replace('"', '\\"', $href), ENT_QUOTES)

Das sind zwei Kontextbehandlungen. htmlentities sorgt dafür, dass der Attributstring das HTML nicht ungültig macht. Unter anderem ersetzt die Funktion "'" durch "&apos;".

Aber du könntest auch den Chor „Shantyclub "Die Brüllaffen"“ haben. Und dann würden Dir die " den JavaScript-Aufruf ruinieren. Denen musst Du deshalb ein \ voranstellen. Und weil PHP das \ als eigenes Escapezeichen verwendet, musst Du es verdoppeln.

Was Du tust, ist gruselig kompliziert. Du hast drei Kontexte: PHP, HTML und dazu noch Javascript in einem HTML String. Das alles richtig zu maskieren... Es gibt Dinge, die noch nicht einmal dem Teufel einfallen würden. Aber Dir 😉

Testfälle:

  • Sailor's Crew
  • Club "Die Brüller"
  • Shantygröler "Sailor's Kruh"

Wie kann man es besser machen? Es gibt mehrere Kritikpunkte.

  • Du verwendest a Elemente als Buttons. Du linkst ja nirgendwo hin, sondern rufst auf einen Klick hin JavaScript auf. Das wollen eigentlich Buttons sein:
<button type="button"><i class='red'>Sail</i>or's Moon</button>
  • Wenn Du die Suchtreffer immer rot hervorhebst, solltest Du keine class="red" setzen, sondern korrekt <em></em> verwenden und das innerhalb der Suchliste per CSS erröten lassen (die Fett/Kursiv-Ambitionen von em musst Du dann natürlich verhindern).

  • Den Buttons kannst Du data-Attribute mitgeben, wo die Daten für die Klickbehandlung drinstehen. Das sind 7 Parameter. Du kannst sieben data-Attribute je Button verwenden, oder alle 7 als json-String codieren und in ein Attribut schreiben. Den müsstest Du dann beim Klick auf den Button zerlegen und an deine Funktion übergeben. Auf diese Weise vermeidest Du geschachtelte Kontexte; JavaScript in einem HTML Attribut ist schon tricky genug. Das mit PHP zu generieren sollte man vermeiden.

  • Für die Buttons registrierst einen Click-Handler - und zwar nicht auf jedem Button, sondern auf dem mitgliederInteressentenVorschlaege div. Der Click bubbelt dann dorthin. Wenn Du HTML im Button-Text hast, musst Du noch ein bisschen aufpassen, weil Du als event.target dann nicht zwingend den Button, sondern das <i> (oder <em>) Elememt bekommst. Dafür gibt's die closest-Methode am HTML Element (nicht im IE) oder du gehst so lange die parent-Kette hoch, bis Du einen Button oder mitgliederInteressentenVorschlaege findest.

Rolf

--
sumpsi - posui - obstruxi