没有非法字符。没有单引号。没有双引号。但是仍然需要转义

时间:2018-08-10 02:18:49

标签: javascript html5

我想所有这些都会起作用。 但是只有4个工作。其他会产生“ missing)”错误。

我经历过的所有“代码检查器”都声称“完全没有错误”。字符串文字完全不包含任何单引号或双引号。

转义 ALL 文本以避免 ALL 错误的秘密方法是什么。

 <div onclick='alert("Bob&apos;s"          );'> 1 works </div>
 <div onclick="alert('Fred&apos;s'         );"> 2 fails </div>
 <div onclick='alert("Say &quot; hi &quot;");'> 3 fails </div>
 <div onclick="alert('Say &quot; hi &quot;');"> 4 works </div>
 <div onclick='alert("Bob&#39;s"           );'> 5 works </div>
 <div onclick="alert('Bob&#39;s'           );"> 6 fails </div>
 <div onclick='alert("Say &#34; hi &#34;"  );'> 7 fails </div>
 <div onclick="alert('Say &#34; hi &#34;'  );"> 8 works </div>

2 个答案:

答案 0 :(得分:2)

在将字符串传递给Javascript之前,将HTML实体转换为它们相应的字符。它们仅在HTML级别而不是Javascript级别对字符进行转义。

第二个尝试执行Javascript:

alert('Fred's');

其中的引号嵌套不正确。您需要包括Javascript转义序列以保护引号:

<div onclick="alert('Fred\&apos;s'         );">

这将执行Javascript:

alert('Fred\'s');

这是有效的。

如果您正在寻找一种通用的方式来生成将始终正确转义的代码,而不必进行详细的分析,那么我认为没有一种方法。最好的解决方案不是首先将Javascript放入HTML属性中,而是让我们使用不引人注目的Javascript。

<div id="fredalert">

<script>
document.querySelector("#fredalert").addEventListener("click", function() {
    alert('Fred\'s');
});
</script>

答案 1 :(得分:1)

&quot;&apos;&#34;&#39;不是JavaScript的一部分。如果HTML解析器在HTML中遇到它们,它将对其进行转换。因此您的代码可以有效读取:

alert("Bob's"           );
alert('Fred's'          );
alert("Say " hi ""      );
alert('Say " hi "'      );
alert("Bob's"           );
alert('Bob's'           );
alert("Say " hi ""      );
alert('Say " hi "'      );

由于可预见的原因而起作用或失败。

正如评论开始所说的那样,最好不要混合使用JavaScript和HTML;使用外部脚本,然后将内容动态附加到DOM(例如,使用document.addEventListener)。如果您绝对需要在HTML属性中包含JavaScript(尽管我从未遇到过这种需求,也无法想象为什么会这样),则可以像通常那样使用反斜杠转义引号:

alert('Bob\'s');

编辑:如果您已经有需要修复的代码,则最简单的方法是确保 JavaScript 是正确的;否则,请执行以下操作。那么如果将此类JavaScript放在HTML属性中,则将与该属性的引号匹配的引号转换为实体。 (不过,如果您过度选择并只转换两种引号,这不会有任何伤害。)因此,假设您要提醒"Hi", said Bob's uncle。为了使其成为字符串,您需要反斜杠转义至少其中一个引号(或使用模板文字)。因此,您将获得"\"Hi\", said Bob's uncle"作为有效的JS字符串。然后,如果要将其放在onclick=""内,则将双引号(或所有引号)放入实体(您可以这样做,以得到最终结果:

onclick="&quot;\&quot;Hi\&quot;, said Bob&apos;s uncle&quot;"

这是一个相当容易实现自动化的过程,假设您首先使用正确的JavaScript,那么它将为您提供正确的JavaScript。