2010-04-01 6 views
1

j'ai suivi cet extrait http://bytes.com/topic/javascript/answers/504399-get-all-text-nodeséviter les caractères spéciaux échapper textnode (JS-HTML)

var xPathResult = document.evaluate(
'.//text()[normalize-space(.) != ""]', 
document.body, null, 
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
null); for (var i = 0, l = xPathResult.snapshotLength; i < l; i++) { 
var textNode = xPathResult.snapshotItem(i); 
textNode.data = textNode.data.replace(/somePattern/g, 'replacement'); 
} 

je veux remplacer certains modèles comme par exemple |12| avec une émoticône correspondante! mais quand je fais textNode.data.replace("|12|",'<.img src="favicon.ico"/>'); par exemple le spectacle texte est ..<.img src="favicon.ico"/>.. que je visite le code html je trouve que <.img src="favicon.ico"/> à &lt;img src="favicon.ico"/&gt; est devenu échappèrent est-il possible d'empêcher cela et de laisser le spectacle d'image ?? Merci Vous

Note: point supplémentaire ajoutée ici &lt;.img src="favicon.ico"/&gt; But

Répondre

5

Oui, data est toujours texte brut. Cela signifie que vous n'avez pas à vous soucier d'y échapper des personnages, mais cela signifie également que vous ne pouvez pas y ajouter de balisage comme <img>. La solution naïve serait de remplacer le innerHTML de l'élément conteneur au lieu d'utiliser l'interface texte. Mais cela peut rapidement vous donner de gros problèmes, en partie parce que vous écrivez innerHTML signifie que vous détruisez et remplacez tous les nœuds existants dans l'élément (avec un désagrément si vous avez des gestionnaires d'événements ou des valeurs de formulaire sur eux étant détruits), mais aussi parce que le traitement simple des chaînes et des regex ne peut gérer correctement le HTML. Par exemple, si vous aviez la chaîne |12| à l'intérieur de n'importe quelle valeur d'attribut, le remplacement ferait un gros désordre.

Mieux: utiliser splitText pour hacher les nœuds de texte en bits au niveau du bord d'une correspondance de motif, puis remplacer le texte représentant qui correspondent à un nouvel élément DOM:

var pattern= /\|12\|/; 
var node= /* Text node you want to replace strings in */; 

while (match= pattern.exec(node.data)) { 
    var img= document.createElement('img'); 
    img.src= 'favicon.ico'; 

    node= node.splitText(match.index); 
    node= node.splitText(match[0].length); 
    node.parentNode.replaceChild(img, node.previousSibling); 
}; 

(On notera que le procédé de XPath obtenir tous les nœuds textes ne sont pas disponibles sur IE)

+0

C'est certainement la meilleure approche. Ne soyez pas séduit par innerHTML pour cela. –

+0

ne pas oublier de créer une boucle qui les fera tous et pas seulement le premier. –

+0

Oui, cette boucle remplace toutes les occurrences d'une chaîne dans un seul noeud Text; vous avez toujours besoin de faire une boucle sur tous les nœuds de texte soit en utilisant XPath, soit en exécutant un arbre manuel/'getElementsByTagName ('*')'. – bobince

0

textNode.data est CDATA dans l'élément. Ce que vous devez remplacer dans textNode.innerHTML

Questions connexes