W jaki sposób nierozdzielająca spacja jest reprezentowana w ciągu JavaScript?

111

To najwyraźniej nie działa:

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

Czy jest coś w nierozdzielającej spacji lub znaku ampersand, czego JavaScript nie lubi?

Phillip Senn
źródło
1
Nie działa jak? Co wtedy robisz z X?
Erik Forbes
Och, jeśli powiem, że X = $ td.html () to działa.
Phillip Senn
8
Pamiętaj, że .text()usuwa znaczniki, więc nie wierzę, że znajdziesz  wynik bez znaczników.
Brad Christie,
1
Może się mylę, ale czy text () nie rozwija encji HTML?
Dennis Kreminsky
@Brad - powinieneś był odpowiedzieć na to pytanie. = P
Erik Forbes

Odpowiedzi:

253

 jest jednostką HTML. Podczas wykonywania .text()wszystkie jednostki HTML są dekodowane do ich wartości znakowych.

Zamiast porównywać za pomocą encji, porównaj używając rzeczywistego surowego znaku:

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

Możesz też ręcznie utworzyć znak na podstawie kodu znaku w postaci kodu ucieczki Javascript:

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

Więcej informacji na temat String.fromCharCodedostępnych jest tutaj:

fromCharCode - MDC Doc Center

Więcej informacji na temat kodów znaków dla różnych zestawów znaków można znaleźć tutaj:

Zestaw znaków Windows-1252 Zestaw
znaków UTF-8

Andrew Moore
źródło
@cobbal: Bardzo prawda ... To byłby właściwie prostszy sposób.
Andrew Moore
3
Łał. Ta odpowiedź jest tak skomplikowana, że ​​musi być poprawna! (Ja i JavaScript jesteśmy jak olej i woda). Ale może jeśli jestem gwałtownie wstrząśnięty, będziemy razem.
Phillip Senn,
Zwykłe spacje się psują, więc jest to „\ x20”, ale lepiej użyć „”.
Patrick Szalapski
7

Pamiętaj, że .text()usuwa znaczniki, więc nie wierzę, że znajdziesz  wynik bez znaczników.

W odpowiedzi ...

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

Pokazuje alert, ponieważ zamiast tego zwracany jest odpowiednik kodu ASCII.

Brad Christie
źródło
2
Używając jQuery możemy zobaczyć, że $("<div>&nbsp;</div>").text().charCodeAt()daje 160(unicode dla nbsp)
cobbal
2

Ta jednostka jest konwertowana na znak, który reprezentuje, gdy przeglądarka renderuje stronę. JS (jQuery) czyta wyrenderowaną stronę, więc nie napotka takiej sekwencji tekstowej. Jedynym sposobem, w jaki może napotkać coś takiego, jest podwójne kodowanie jednostek.

JAAulde
źródło
0

Dokumentacja jQuery dla text()mówi

Ze względu na różnice w parserach HTML w różnych przeglądarkach zwracany tekst może różnić się nowymi wierszami i innymi białymi znakami.

Chciałbym użyć $td.html()zamiast.

Jacob Mattison
źródło
Spowoduje to dodanie znaczników HTML do znaczników Twojej strony. Na przykład ciąg „<text>” będzie elementem HTML.
Barh