2009-12-31 3 views
0

J'ai un problème en passant des paramètres que je pense que je devrais pouvoir résoudre avec élégance (avec 1 ligne de code) mais je n'arrive pas à résoudre le problème. J'ai un lien pour supprimer des éléments, comme ceci:Passer une mauvaise chaîne en tant que paramètre javascript

<a href="javascript:confirmDelete('${result.headline}',${result.id});">

Le problème se pose lorsque result.headline contient des caractères comme « ou» ou d'autres qui rompent l'appel javascript j'ai essayé ${fn:replace(result.headline,"'","")} qui résout les problèmes pour. » cependant je veux faire une sorte d'URLEncode (je pense) pour que ces caractères ne cassent pas l'appel javascript.Toutes les idées sur comment résoudre ceci sans rien changer sur le back-end?

Répondre

3

Évitez de mettre du code JavaScript dans les éléments, en particulier javascript: pseudo-URL qui (en plus d'être Evil qui ne devrait jamais être utilisé) sont JavaScript-dans-URL-en-HTML. Vous devez prendre le titre et:

  1. Chaîne littérale JavaScript-l'encoder. (Remplacez \, ', contrôlez des caractères et des caractères potentiellement Unicode, ou utilisez simplement un codeur JSON pour le faire pour vous.) Puis,
  2. URL le coder. Puis,
  3. HTML-le coder.

Mieux vaut mettre les données dans le balisage où vous avez seulement à vous soucier de codage simple HTML dans la façon dont vous le faites partout ailleurs pour éviter de script inter-sites:

<a href="#" class="confirmdelete-${fn:escapeXml(result.id)}" title="${fn:escapeXml(result.headline)}">Delete</a> 

et ont le JavaScript les extraire:

<script type="text/javascript"> 
    for (var i= document.links.length; i-->0;) { 
     var link= document.links[i]; 
     if (link.className.indexOf('confirmdelete-')===0) { 
      link.onclick= function() { 
       confirmDelete(this.title, this.className.substring(14)); 
       return false; 
      }; 
     } 
    } 
</script> 

(il y a potentiellement plus simples, des moyens plus ou moins propres de l'écriture ci-dessus en utilisant des fonctions d'utilité ou de cadres, et il y a un argument à avoir quant à savoir si un lien est vraiment le balisage droit pour ce genre d'action, mais c'est l'idée de base.)

+0

J'essaie d'implémenter cette réponse mais j'ai un problème. Je peux confirmer que le link.onclick est en cours de définition, mais lorsque je clique sur le lien, il n'y a pas d'action. Des idées pour lesquelles cela pourrait se produire? – UmYeah

+0

Vérifiez les erreurs JavaScript sur la console et placez des appels 'alert ('hello')' dans la fonction onclick afin de voir jusqu'où ça va? – bobince

0

Tant que vous pouvez compter sur le fait que les chaînes n'aient pas de saut de ligne, tout ce que vous avez à faire est de doubler toutes les barres obliques inverses et d'échapper toutes les guillemets simples

Par exemple:

replace(replace(result.headline, "\\", "\\\\"), "'", "\\'") 

Cela pourrait ne pas être une syntaxe valide dans votre langue côté serveur; Je ne le reconnais pas.

Questions connexes