2009-05-21 10 views
4

je charge du HTML via Ajax avec ce format:jQuery: Parse/HTML sans Manipulez scripts d'exécution

je dois itérer sur chaque div dans la réponse et la poignée séparément. Avoir une chaîne distincte pour le contenu HTML de chaque div mappé à l'id répondrait à mes exigences. Cependant, les divs peuvent contenir des tags de script, que je dois conserver mais pas exécuter (ils seront exécutés plus tard quand je collerai le HTML dans le document, donc l'exécution pendant l'analyse serait mauvaise). Ma première pensée était de faire quelque chose comme ceci:

// data being the result from $.get 
var clean = data.replace(/<script.*?</script>/,function() { 
    // insert some unique token, save the tag, put it back while I'm processing 
}); 

$('<div/>').html(clean).children().each(/* ... process here ... */); 

Mais je crains que certains dev va venir stupide et mettre quelque chose comme ça dans l'un des divs:

<script> var foo = '</script>'; // ... </script> 

qui visserait tout ça. Sans parler du fait que tout cela ressemble à un hack. Est-ce que quelqu'un sait un meilleur moyen?

EDIT: Voici la solution que je suis venu avec:

var divSplitRegex = /(?:^|<\/div>)\s*<div\s+id="prefix-(.+?)">/g, 
    idReplacement = preDelimeter+'$1'+postDelimeter; 
var r = data.replace(<\/div>\s*$/,''). 
    replace(divSplitRegex,idReplacement).split(preDelimeter); 
$.each(r,function() { 
    var content; 
    if(this) { 
     callback.apply(null,this.split(postDelimeter)); 
    } 
}); 

Où preDelimiter et postDelimeter sont des chaînes simplement uniques comme « ### Je dois être idiot pour intégrer cette chaîne dans mon le contenu est non échappé parce qu'il casserait tout ### ', et le callback est une fonction qui attend l'ID div et le contenu div Cela ne fonctionne que parce que je sais que les divs auront seulement un identifiant id et l'identifiant aura un préfixe spécial Je suppose que quelqu'un pourrait mettre un div dans leur contenu avec un identifiant ayant le même préfixe et il ferait des foutaises aussi. J'adore cette solution. Quelqu'un en at-il un meilleur?

Répondre

3

FYI, L'utilisation d'un script JavaScript sans échappement provoque ce problème dans un navigateur. Les développeurs doivent y échapper de toute façon, donc il n'y a pas d'excuse. Donc vous pouvez "faire confiance" qui casse dans tous les cas.

<body> 
<div> 
    <script> 
    alert('<script> tags </script> are not '+ 
     'valid in regular old HTML without being escaped.'); 
    </script> 
</body> 

Voir

http://jsbin.com/itevu

pour le voir briser. :)

+0

Je suppose que cela signifie que ma première solution sera sûre. Je ne l'aime pas, mais ça marche. – noah

2

Dans certains cas, la suppression de balises de script HTML invalide entraîne:

<html> 
    <head> 
    </head> 
    <body> 
     <p>This should be 
     <script type="text/javascript"> 
      document.writeln("<b"); 
     </script>>bolded</b>. 
    </body> 
</html> 
-2

probablement, une autre approche sera utile pour vous. Vous pouvez utiliser la fonction suivante pour empêcher JavaScript de fonctionner:

function preventJS(html) { 
    return html.replace(/<script(?=(\s|>))/i, '<script type="text/xml" '); 
} 

Et il conserve le script balises dans les DOM, si les scripts peuvent être utilisés plus tard.

J'ai décrit cette façon dans mon blog ici - JavaScript: How to prevent execution of JavaScript within a html being added to the DOM.

Questions connexes