Comment un espace insécable est-il représenté dans une chaîne JavaScript?

111

Cela ne fonctionne apparemment pas:

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

Y a-t-il quelque chose à propos d'un espace insécable ou de l'esperluette que JavaScript n'aime pas?

Phillip Senn
la source
1
Ne fonctionne pas comment? Que faites-vous alors avec X?
Erik Forbes
Oh, si je dis X = $ td.html () cela fonctionne.
Phillip Senn
8
N'oubliez pas que cela .text()supprime le balisage, donc je ne pense pas que vous allez trouver  un résultat sans balisage.
Brad Christie
1
Je me trompe peut-être ici, mais text () ne développe-t-il pas les entités html?
Dennis Kreminsky
@Brad - vous auriez dû en faire une réponse. = P
Erik Forbes

Réponses:

253

 est une entité HTML. Ce faisant .text(), toutes les entités HTML sont décodées selon leurs valeurs de caractère.

Au lieu de comparer en utilisant l'entité, comparez en utilisant le caractère brut réel:

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

Ou vous pouvez également créer le caractère à partir du code de caractère manuellement dans sa forme d'échappement Javascript:

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

Plus d'informations sur String.fromCharCodesont disponibles ici:

fromCharCode - Centre de documentation MDC

Plus d'informations sur les codes de caractères pour différents jeux de caractères sont disponibles ici:

Jeu de caractères Windows-1252 Jeu de
caractères UTF-8

Andrew Moore
la source
@cobbal: Très vrai ... Ce serait le moyen le plus simple en fait.
Andrew Moore
3
Sensationnel. Cette réponse est tellement compliquée, elle doit être correcte! (Moi et JavaScript sont comme l'huile et l'eau). Mais peut-être que si je suis secoué violemment, nous nous mélangerons.
Phillip Senn
Les espaces ordinaires se cassent, donc c'est '\ x20', mais mieux vaut utiliser ''.
Patrick Szalapski
7

N'oubliez pas que cela .text()supprime le balisage, donc je ne pense pas que vous allez trouver  un résultat sans balisage.

Conçu pour une réponse ...

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

Affiche une alerte, car l'équivalent ASCII du balisage est renvoyé à la place.

Brad Christie
la source
2
En utilisant jQuery, nous pouvons voir que $("<div>&nbsp;</div>").text().charCodeAt()donne 160(unicode pour nbsp)
cobbal
2

Cette entité est convertie en caractère qu'elle représente lorsque le navigateur affiche la page. JS (jQuery) lit la page rendue, il ne rencontrera donc pas une telle séquence de texte. La seule façon dont il pourrait rencontrer une telle chose est si vous êtes des entités à double codage.

JAAulde
la source
0

La documentation jQuery pour text()dit

En raison des variations des analyseurs HTML dans différents navigateurs, le texte renvoyé peut varier dans les nouvelles lignes et autres espaces blancs.

J'utiliserais à la $td.html()place.

Jacob Mattison
la source
Cela ajoutera des balises HTML au balisage de votre page. Par exemple, la chaîne «<text>» sera un élément html.
Barh