转义单引号

7
我有一个简单的脚本:onclick='sharemusic("Say It Ain't So", "Weezer");'。由于“Ain't”中的撇号,它无法正常工作。如何在不影响代码功能的情况下转义撇号?谢谢!

1
不要以这种方式绑定处理程序,这样您就可以完全避免这个问题! - Evan Davis
在你的问题中,你已经用反斜杠转义了撇号,这不起作用吗? - Ajedi32
我会在你的元素上使用数据属性,然后像这样做:<element onclick="shareMusic()" data-title="Say it Ain't So" data-artist="Weezer" /> - Ronnie
@dfdf 你说你正在使用PHP,那么你可以使用内置的htmlspecialchars函数来为你更改实体吗?http://php.net/manual/zh/function.htmlspecialchars.php - Iron3eagle
1
另一种选择是使用正确的撇号,而不是印刷机的撇号。onclick="sharemusic('Say It Ain’t So', 'Weezer');" 将正常工作。;-) - JimmiTh
显示剩余9条评论
6个回答

12
我不太情愿添加这个答案,因为其他所有答案都很好,并且对大多数人会更有用——通过回答根本问题:“如何在HTML属性内部使用JavaScript转义”——而这个答案不会回答这个问题。
有些人认为以下方法是一个变通方法,而其他人将其视为唯一的适当解决方案™。
摆脱打字机撇号——虽然打字机非常酷,时尚并富有复古风格,但我们可以做得更好,甚至可以回到更为正统的印刷体撇号(也称为“曲折号”)。
作为副作用,这也将解决转义问题。
onclick="sharemusic('Say It Ain’t So', 'Weezer');"

排版专业人士会很高兴,浏览器也会很高兴。只要您使用像应该使用的UTF-8或其他包含印刷用撇号的编码方式。Unicode: U+2019,实体:&#8217;&rsquo;(是的,它与右单引号分享其码点,但仍然是“正确”的撇号)。
如评论中所提到的,有各种库和CMS /博客插件可帮助处理转换为正确的印刷符号(以及其他印刷技巧)。请参见wp-Typographysmartypants(我认为这是类似实现中最早的一个 - 由Markdown的原作者John Gruber开发)、typogrify等。
我不知道是否还有任何更近期的替代方案,因为很久以前我就自己做了一个(非公共的,我必须承认)C#实现。

正如我在评论中所说,这个答案太棒了。是的,我知道这不是最好的方法,但它对我想做的事情百分之百有效。谢谢,伙计 :) - seanlevan

6

如果你一定要在JavaScript中转义,而不是使用HTML实体,你可以使用它的Unicode表示

"\u0027" // "'"
"Say It Ain\u0027t So" // "Say It Ain't So"

你可以通过以下方式计算出Unicode表示:
"'".charCodeAt(0) // 39
   .toString(16)  // "27"
// So pad 27 to 4 digits, then prepend \u

当使用HTML时,最好按照MrJammin回答中建议的使用HTML实体,因为这样可以避免出现问题,或者将其完全移出HTML。否则,您需要转义可能会导致问题的所有内容,例如将&的所有实例替换为\u0026,而不是简单地使用更易读的&amp;以及其他引号样式。


2

您需要使用HTML实体,例如:

onclick="sharemusic(&quot;Say It Ain't So&quot;, &quot;Weezer&quot;);"

但是正如其他人所说,你可能不应该以这种方式绑定点击事件(将JS抽象成自己的文件并使用addEventHandler


我知道这是可以做到的,我只是想知道是否可以在不转换实体的情况下完成。 - seanlevan

2
这些都是非常好的答案,但几乎完全取决于代码的情况。
如果它是一次性的,其中的值是硬编码的,并且永远不会在页面外部使用,则Cobra_Fast的解决方案是最快,最简单的。
如果您的数据来自外部或动态来源,但仅用于HTML显示,则matt3141的解决方案可能最适合这种情况(即将数据存储以便在页面上显示)。
如果您的数据来自外部来源,并且既用于HTML演示,也用于外部系统中,则Paul S.的答案显然是最具可移植性的,因为HTML仅用于HTML使用,可能需要翻译为外部系统...另一方面,Unicode在技术领域有更广泛的支持。
此外,正如Paul S.所暗示的那样...在页面上对JS值进行任何其他“预处理”可能导致需要添加额外的编码级别...例如,&quot;变成&amp;quot;'Say It Ain\'t So'变成'Say It Ain\\'t So'(甚至是'Say It Ain\\\\'t So',如果事情变得非常复杂)。

1
使用以下 HTML 实体。
onclick='sharemusic("Say It Ain&#39;t So", "Weezer");'

1

首先,按照标准要求使用双引号作为属性的符号。

其次,将JS字符串放在单引号中,并使用反斜杠转义额外的单引号。

onclick="sharemusic('Say It Ain\'t So', 'Weezer');"

虽然我也更喜欢在属性中使用双引号,但标准并没有描述它。所有HTML、XHTML和XML的规范和建议都允许使用单引号。 - JimmiTh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接