Wie wird ein nicht unterbrechendes Leerzeichen in einer JavaScript-Zeichenfolge dargestellt?

109

Das funktioniert anscheinend nicht:

X = $td.text();
if (X == ' ') {
X = '';
}

Gibt es etwas an einem nicht unterbrechenden Leerzeichen oder dem kaufmännischen Und, das JavaScript nicht mag?

Phillip Senn
quelle
1
Funktioniert nicht wie? Was machst du dann mit X?
Erik Forbes
Oh, wenn ich X = $ td.html () sage, funktioniert es.
Phillip Senn
8
Denken Sie daran, dass .text()das Markup entfernt wird, daher glaube ich nicht, dass Sie  ein Ergebnis ohne Markup finden werden.
Brad Christie
1
Ich kann mich hier irren, aber erweitert text () HTML-Entitäten nicht?
Dennis Kreminsky
@Brad - du hättest das eine Antwort machen sollen. = P
Erik Forbes

Antworten:

251

 ist eine HTML-Entität. Dabei .text()werden alle HTML-Entitäten auf ihre Zeichenwerte dekodiert.

Anstatt mit der Entität zu vergleichen, vergleichen Sie mit dem tatsächlichen Rohzeichen:

var x = td.text();
if (x == '\xa0') { // Non-breakable space is char 0xa0 (160 dec)
  x = '';
}

Sie können das Zeichen auch manuell aus dem Zeichencode in seiner mit Javascript maskierten Form erstellen:

var x = td.text();
if (x == String.fromCharCode(160)) { // Non-breakable space is char 160
  x = '';
}

Weitere Informationen zu finden Sie String.fromCharCodehier:

fromCharCode - MDC Doc Center

Weitere Informationen zu Zeichencodes für verschiedene Zeichensätze finden Sie hier:

Windows-1252 Zeichensatz
UTF-8 Zeichensatz

Andrew Moore
quelle
@ Cobbal: Sehr wahr ... Das wäre eigentlich der einfachere Weg.
Andrew Moore
3
Beeindruckend. Diese Antwort ist so kompliziert, dass sie richtig sein muss! (Ich und JavaScript sind wie Öl und Wasser). Aber vielleicht mischen wir uns, wenn ich heftig erschüttert bin.
Phillip Senn
Gewöhnliche Leerzeichen brechen, daher ist es '\ x20', aber besser '' zu verwenden.
Patrick Szalapski
7

Denken Sie daran, dass .text()das Markup entfernt wird, daher glaube ich nicht, dass Sie  ein Ergebnis ohne Markup finden werden.

Zu einer Antwort gemacht ....

var p = $('<p>').html('&nbsp;');
if (p.text() == String.fromCharCode(160) && p.text() == '\xA0')
    alert('Character 160');

Zeigt eine Warnung an, da stattdessen das ASCII-Äquivalent des Markups zurückgegeben wird.

Brad Christie
quelle
2
Mit jQuery können wir sehen, dass $("<div>&nbsp;</div>").text().charCodeAt()gibt 160(Unicode für nbsp)
Cobbal
2

Diese Entität wird in das Zeichen konvertiert, das sie darstellt, wenn der Browser die Seite rendert. JS (jQuery) liest die gerenderte Seite und trifft daher nicht auf eine solche Textsequenz. Die einzige Möglichkeit, auf so etwas zu stoßen, besteht darin, Entitäten doppelt zu codieren.

JAAulde
quelle
0

Die jQuery-Dokumente für text()sagt

Aufgrund von Variationen in den HTML-Parsern in verschiedenen Browsern kann der zurückgegebene Text in Zeilenumbrüchen und anderen Leerzeichen variieren.

Ich würde $td.html()stattdessen verwenden.

Jacob Mattison
quelle
Dadurch werden dem Markup Ihrer Seite HTML-Tags hinzugefügt. Beispielsweise ist die Zeichenfolge '<Text>' ein HTML-Element.
Barh