Как неразрывный пробел представлен в строке JavaScript?

111

По-видимому, это не работает:

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

Есть ли что-то в неразрывном пробеле или амперсанде, что не нравится JavaScript?

Филипп Сенн
источник
1
Не работает как? Что вы тогда делаете с X?
Эрик Форбс
О, если я скажу X = $ td.html (), это сработает.
Филлип Сенн
8
Помните, что .text()разметка удаляется, поэтому я не верю, что вы найдете  результат без разметки.
Брэд Кристи
1
Возможно, я ошибаюсь, но разве text () не расширяет html-сущности?
Деннис Кременский
@Brad - ты должен был дать такой ответ. = P
Эрик Форбс

Ответы:

253

 это объект HTML. При этом .text()все объекты HTML декодируются в свои символьные значения.

Вместо сравнения с использованием сущности сравните с использованием фактического необработанного символа:

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

Или вы также можете создать символ из кода символа вручную в его экранированной форме Javascript:

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

Более подробную информацию String.fromCharCodeможно найти здесь:

fromCharCode - Центр документации MDC

Более подробная информация о кодах символов для различных кодировок доступна здесь:

Кодировка Windows-1252
Кодировка UTF-8

Эндрю Мур
источник
@cobbal: Совершенно верно ... На самом деле это был бы более простой способ.
Эндрю Мур
3
Вот это да. Этот ответ настолько сложен, что он должен быть правильным! (Я и JavaScript подобны маслу и воде). Но, может быть, если я сильно встряхнусь, мы смешаемся вместе.
Филлип Сенн,
Обычные пробелы ломаются, так что это '\ x20', но лучше использовать ''.
Патрик Салапски
7

Помните, что .text()разметка удаляется, поэтому я не верю, что вы найдете  результат без разметки.

Сделано для ответа ....

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

Показывает предупреждение, поскольку вместо него возвращается ASCII-эквивалент разметки.

Брэд Кристи
источник
2
Используя jQuery, мы видим, что это $("<div>&nbsp;</div>").text().charCodeAt()дает 160(unicode для nbsp)
cobbal 08
2

Этот объект преобразуется в символ, который он представляет, когда браузер отображает страницу. JS (jQuery) читает отображаемую страницу, поэтому такая текстовая последовательность не встречается. Единственный способ встретить такое - это двойное кодирование объектов.

JAAulde
источник
0

Документы jQuery для text()говорит

Из-за различий в парсерах HTML в разных браузерах возвращаемый текст может отличаться новой строкой и другими пробелами.

Я бы использовал $td.html()вместо этого.

Джейкоб Мэттисон
источник
Это добавит теги HTML в разметку вашей страницы. Например, строка «<text>» будет элементом html.
Barh