[英]javascript quotes inside quotes, string literal issue
我试图在javascript工具提示中显示文本
即使以下情况,我仍然会得到未终止的字符串文字:a)引号被削减,b)没有换行符
我试图显示的文字是:
"No, we can't. This is going to be terrible."
(它来自个人的报价,我希望这些报价显示在工具提示中)
我的工具提示功能就像这样
onMouseOver="Tip('string here')"
我通过我的函数运行字符串来清理javascript
function jschars($str) {
echo preg_replace("/\r?\n/", "\\n", addslashes($str));
}
它在HTML中看起来像这样:
onMouseOver="Tip('\"No, we can\'t. This is going to be terrible.\"')"
这给了我错误的未终止字符串文字为Tip中的第一个\\('\\
我猜它是因为我试图将引号直接放在单引号内,我怎样才能解决这个问题呢? (我尝试过htmlspecial chars,例如替换“with” - 我仍然得到错误
这是因为你在XML(或html)元素的值中加入了双引号:
<div onMouseOver="Tip('\".......
反斜杠不会从xml / html的上下文中逃脱它。 从技术上讲,你需要对字符串进行实体编码(在javascript-escape之后)。 像这样的东西:
<div onMouseOver="Tip('\"No, we can\'t. This is going to be terrible.\"')" >
各种浏览器可能会或可能不会正确处理。 一个更好的方式来处理这将是给元素的ID(或一类,或者一些其他的方法可以让你选择它),然后在处理从一个独立的脚本中添加鼠标。
由于你正在做的结构:
onMouseOver="Tip('string here')"
......你必须做两件事:
正如Lekensteyn所说,你需要使用htmlspecialchars
将任何特殊的HTML字符转换为字符转义。 它会像"
转入"
,这意味着您可以安全地将属性括在"
字符”中。
但是你不只是将它作为属性使用,你也将它放在一个字符串文字中,这意味着你还需要对字符串进行JavaScript转义。 否则,(在你的情况下)单个'
字符或反斜杠会弄乱字符串。 所以你的jschars
函数也需要(按顺序)A)将\\
转换为\\\\
,B)将'
转换为\\'
。 这是最小的,无论如何,你真的需要一个彻底的“让这个安全放入JavaScript文字”功能。 从你的问题来看,我有一种你手动做的印象,但最好自动化它以保持一致性。
偏离主题 :另外,我建议不要使用属性来附加处理程序。 相反,请查看attachEvent
(IE)和addEventListener
(W3C),或者更好地查看一个类似jQuery , Closure , Prototype , YUI或其他任何可以为您解决问题的库。 例如,将鼠标悬停处理程序附加到:
您可以使用此处理程序来处理鼠标悬停:
function handler() {
Tip('Your message here');
}
...然后你用原始的DOM东西连接起来(显然你会为此制作一个实用功能):
var div = document.getElementById('foo');
if (div.attachEvent) {
// Uses "onmouseover", not "mouseover"
div.attachEvent('onmouseover', handler);
}
else if (div.addEventListener) {
// Uses "mouseover", not "onmouseover"
div.attachEvent('mouseover', handler, false);
}
else {
// Fallback to old DOM0 stuff
div.onmouseover = handler;
}
以下是Prototype如何简化连接过程:
$('foo').observe('mouseover', handler);
这是jQuery的作用:
$('#foo').mouseover(handler);
您应该使用htmlspecialchars()
来实现此目的。 问题是“,但HTML不会理解javascript引用,所以它停在\\"
。
function jschars($str) {
echo htmlspecialchars(preg_replace("/\r?\n/", "\\n", $str), ENT_QUOTES);
}
您可以将字符串保留为javascript而不是HTML。 例如:
<a onmouseover="Tip(this, 123)">choice</a>
然后像:
var texts = {
123:"No, we can't. This is going to be terrible.",
...
};
function Tip(elm, txtId){
showTip(elm, texts[txtid];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.