J'utilise la fonction suivante qui échappe tous les caractères avec la balise &# nnn ; sauf pour la notation a-z A-Z 0-9 y espace
function Escape( s )
{
var h,
i,
n,
c;
n = s.length;
h = '';
for( i = 0; i < n; i++ )
{
c = s.charCodeAt( i );
if( ( c >= 48 && c <= 57 )
||( c >= 65 && c <= 90 )
||( c >= 97 && c <=122 )
||( c == 32 ) )
{
h += String.fromCharCode( c );
}
else
{
h += '&#' + c + ';';
}
}
return h;
}
Exemple :
Escape('<b>This is some text</b>')
renvoie à
<b>This is some text</b>
La fonction est une preuve d'attaques par injection de code, une preuve d'unicode, du pur JavaScript.
Cette approche est environ 50 fois plus lent que celle qui crée le noeud de texte DOM, mais la fonction échappe une chaîne de un million (1 000 000) de caractères en 100-150 millisecondes.
(Testé sur MacBook Pro début 2011 - Safari 9 - Mavericks)