web-dev-qa-db-fra.com

Citations d'imbrication en JavaScript / HTML

Comment nichez-vous des devis en HTML au-delà du deuxième niveau? Autant que je sache, il n'y a que 2 types de citations - célibataire (') et doubles ("). Je suis au courant de s'échapper à l'aide de slashes - vous devez vous échapper dans le code, mais que l'échappement ne fonctionnera pas au niveau du navigateur . Quelle est la méthode acceptée pour contourner quelque chose comme ce qui suit?

<p onclick="exampleFunc('<div id="divId"></div>');">Some Text</p>

Ce code est imprimé sur le navigateur:

'); "> Du texte

29
Ryan Elkins

Vous devez utiliser correctement l'évacuation/encodage. Soit en HTML à l'aide de références de caractères:

<p onclick="exampleFunc('&lt;div id=&quot;divId&quot;&gt;&lt;/div&gt;');">Some Text</p>

Ou en JavaScript à l'aide de String Escape séquences:

<p onclick="exampleFunc('\x3Cdiv\x20id\x3D\x22divId\x22\x3E\x3C/div\x3E');">Some Text</p>
33
Gumbo

EDIT: Ce n'est pas une solution pour JavaScript dans HTML, mais pour JavaScript uniquement. Ma faute...

eval('eval(\"eval(\\\"alert(\\\\\\\"Now I\\\\\\\\\\\\\\\'m confused!\\\\\\\")\\\")\")');

Link . C'est "une échappée récursive".

2
jonS90
    const _advanceEscapeCount = (escapeCount, level) => {
      const linearPosition = Math.log(escapeCount + 1) / Math.log(2);
      return Math.pow(2, (linearPosition + level)) - 1;
    };

    const deepNestQuotes = (str, level) => {
      for (let i = str.length - 1; i >=0 ; i--) {

        if (str[i] === '"') {

          const index = i;
          let count = 0;
          while (str[i - 1] === '\\') {
            count++;
            i--;
          }

          const firstPart = str.substr(0,index - count);
          const lastPart = str.substr(index,str.length);

          const escapedCount = _advanceEscapeCount(count, level);
          str = firstPart +  '\\'.repeat(escapedCount) + lastPart;
          //str = firstPart +  escapedCount + lastPart;
        }
      }

      return str;
    };



    deepNestQuotes("1st-level-begin \"2nd-begin   \\\"3rd-begin  \\\\\\\"4th level\\\\\\\"   3rd-end\\\"   2nd-end\" 1st-level-end", 1);

    deepNestQuotes("1st-level-begin \"2nd-begin   \\\"3rd-begin  \\\\\\\"4th level\\\\\\\"   3rd-end\\\"   2nd-end\" 1st-level-end", 2);
0
Shabeer