66 votes

Échapper aux guillemets doubles dans le gestionnaire d'événement JavaScript onClick

Le bloc de code simple ci-dessous peut être affiché dans une page HTML statique mais entraîne une erreur JavaScript. Comment devez-vous échapper au guillemet double intégré dans le bloc de code onClick (c'est-à-dire "xyz") ? Notez que le code HTML est généré dynamiquement en extrayant des données d'une base de données, dont les données sont des extraits d'autres codes HTML qui peuvent avoir des guillemets simples ou doubles. Il semble que l'ajout d'une simple barre oblique inversée devant le caractère de guillemet double ne fasse pas l'affaire.

<script type="text/javascript">
    function parse(a, b, c) {
        alert(c);
    }
</script>

<a href="#x" onclick="parse('#', false, '<a href=\"xyz'); return false">Test</a>

95voto

landon9720 Points 11241

Avez-vous essayé

&quot; ou \x22

au lieu de

\"

?

7 votes

Je viens de tester cela dans FF3.6 et IE8 avec un scénario similaire et cela n'a pas fonctionné. Cependant, le remplacement du " par " a fonctionné. J'ai également testé le code exact ci-dessus et cela a fonctionné dans les deux cas. En bref, le \x22 ne semble pas fonctionner dans tous les scénarios et vous devriez essayer " dans ce cas.

3 votes

Joli. "semble fonctionner dans les attributs des balises html dans Webkit, Firefox et Opera.

0 votes

Pour moi, &quot; a bien fonctionné dans un événement de clic : <a href="javascript:;" onclick="$(&quot;[id$='_txtFieldToClear']&quot;).val(&quot;&‌​quot;);">Clear</a>

59voto

Aseem Kishore Points 1972

Il doit être encodé en HTML, pas en Javascript. Modifier \" à &quot;

0 votes

La meilleure réponse, car elle explique également le "pourquoi".

8voto

seth Points 18409

Bien que je sois d'accord avec le CMS pour faire cela de manière discrète (via une librairie comme jquery ou dojo), voici ce qui fonctionne également :

<script type="text/javascript">
function parse(a, b, c) {
    alert(c);
  }

</script>

<a href="#x" onclick="parse('#', false, 'xyc&quot;foo');return false;">Test</a>

La raison pour laquelle il y a des ratés n'est pas due à JavaScript, mais à l'analyseur HTML. Il n'a aucun concept de guillemets échappés, il se promène à la recherche du guillemet final, le trouve et le renvoie à la fonction onclick. Il s'agit d'un javascript invalide, donc vous ne découvrirez l'erreur que lorsque JavaScript essaiera d'exécuter la fonction.

3 votes

Downvote. Vous n'avez PAS besoin d'un cadre pour quelque chose comme ça !

5voto

Mark A. Nicolosi Points 11859

Vous pouvez également essayer d'utiliser deux antislashes. (\\") pour échapper au caractère d'échappement.

1 votes

Classique. Stackoverflow a mangé un de tes backslashes et n'a affiché que l'autre. Je l'ai corrigé pour toi.

1voto

CMS Points 315406

Je pense que la meilleure approche est d'assigner le gestionnaire onclick discrètement .

Quelque chose comme ça :

window.onload = function(){
    var myLink = document.getElementsById('myLinkId');
    myLink.onclick = function(){ 
        parse('#', false, '<a href="xyz');
        return false;
    }
}

//...

<a href="#" id="myLink">Test</a>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X