­ finden
Jeena Paradies
- javascript
Hallo,
Warum bekomme ich hierbei ein false in allen Browsern?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>&shy; Test</title>
<script type="text/javascript">
[code lang=javascript]function foo() {
alert("­" == document.getElementsByTagName("p")[0].innerHTML);
}
</script>
</head>
<body onload="foo();">
<p>­</p>
</body>
</html>[/code]
Wenn ich das gleiche mit & mache dann kommt true.
Jeena
Hallo Jeena.
Warum bekomme ich hierbei ein false in allen Browsern?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>&shy; Test</title>
<script type="text/javascript">
[code lang=javascript]function foo() {
alert("­" == document.getElementsByTagName("p")[0].innerHTML);
}
> </script>
> </head>
> <body onload="foo();">
> <p>­</p>
> </body>
> </html>[/code]
>
> Wenn ich das gleiche mit & mache dann kommt true.
Hast du dir schon einmal den Wert von document.getElementsByTagName("p")[0].innerHTML ausgeben lassen? Was du hier siehst, ist auch das, was JS sieht. Dein „­“ entspricht also einer normalen Zeichenkette, da sich JS nicht die Bohne für Zeichenreferenzen interessiert
Eine Vergleichsmöglichkeit wäre also die Nutzung von charCodeAt:
`alert(173 == document.getElementsByTagName("p")[1].innerHTML.charCodeAt(0)); // true`{:.language-javascript}
Einen schönen Dienstag noch.
Gruß, Mathias
--
ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
debian/rules
Hallo,
Danke, das hilft weiter, auch wenn ich dennoch nicht ganz nachvollziehen kann warum das mit & funktioniert.
Jeena
Hallo Jeena,
Danke, das hilft weiter, auch wenn ich dennoch nicht ganz nachvollziehen kann warum das mit & funktioniert.
Naja, innerHTML liefert Dir den Inhalt des Knoten so, wie er im Speicher vorhanden ist. Beim Parsen dekodiert der Browser nun die Zeichenreferenzen (Entites und NCRs) und ­ wird zu einem Unicode-Zeichen mit spezifischem Zeichencode. Wenn Du Dir das dann per innerHTML liefern lässt, dann bekommst Du gerade eine Zeichenkette zurück, die dieses Zeichen enthält, nicht jedoch ­.
Wenn Du dagegen einen Textknoten hast und als Text-Inhalt (!) '&' drin stehen hast und _dann_ per innerHTML darauf zugreifst, dann würde innerHTML im ersten Schritt Dir auch wirklich ein '&' liefern - allerdings hat innerHTML seinen Namen ja durchaus nicht zu Unrecht bekommen, es heißt ja inner_HTML_ und nicht inner_Text_ - d.h. innerHTML liefert Dir immer HTML-Code zurück - und damit muss der Text des Textknotens kodiert werden. Ein & wird daher zu &. Das Zeichen, für das ­ steht, hat jedoch keine besondere Bedeutung in HTML, d.h. es ist für den Browser kein Problem, das unkodiert zurückzugeben, der HTML-Codeausschnitt, den innerHTML zurückgeben würde, würde den identischen Effekt haben wie ein HTML-Codeausschnitt, der ­ enthält - daher ist es unnötig, das Zeichen als ­ zu kodieren und Du erhälst das Zeichen direkt im String.
Ich hab's jetzt nicht ausprobiert, aber ich würde wetten, dass Du bei & auch nur ein '&' und kein '&' zurückbekommen würdest, wenn Du mittels .firstChild.nodeValue auf den Inhalt des Textknotens im <p>-Element zugreifst und nicht über innerHTML.
Viele Grüße,
Christian
hi,
Ich hab's jetzt nicht ausprobiert, aber ich würde wetten, dass Du bei & auch nur ein '&' und kein '&' zurückbekommen würdest, wenn Du mittels .firstChild.nodeValue auf den Inhalt des Textknotens im <p>-Element zugreifst und nicht über innerHTML.
Ja, dem ist so.
Ich habe mal in einem Text um jedes einzelne Zeichen einen Span drumherum legen wollen.
Gehe ich da über innerHTML ran (split und dann mit <span></span> drumherum wieder zusammenfügen), bekomme ich für ein & im Text & zurück, und damit ein Problem - das sind fünf Zeichen, die ich für diesen Zweck aber wie eines behandeln müsste - umständlich und aufwendig (kämen ja auch noch weitere wie <, > und ggf. auch noch " hinzu).
Gehe ich aber über nodeValue bzw. lieber gleich data eines Textknotens daran, bekomme ich &, <, > und Co. zurück - mit denen sich für einen solchen Zweck natürlich leichter arbeiten lässt.
gruß,
wahsaga
Hallo,
Eine Vergleichsmöglichkeit wäre also die Nutzung von charCodeAt:
alert(173 == document.getElementsByTagName("p")[1].innerHTML.charCodeAt(0)); // true
Oder einfach innerHTML == "\u00AD".
Mathias
Hallo molily.
Eine Vergleichsmöglichkeit wäre also die Nutzung von charCodeAt:
alert(173 == document.getElementsByTagName("p")[1].innerHTML.charCodeAt(0)); // true
Oder einfach innerHTML == "\u00AD".
Ah, danke. Diese Schreibweise wollte mir partout nicht mehr einfallen.
Einen schönen Mittwoch noch.
Gruß, Mathias