我正在尝试在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& quot;” - 我仍然得到错误
答案 0 :(得分:12)
这是因为你将双引号放在XML(或html)元素的值中:
<div onMouseOver="Tip('\".......
反斜杠不会从xml / html的上下文中将其转义。从技术上讲,你需要对字符串进行实体编码(在javascript-escape之后)。像这样:
<div onMouseOver="Tip('\"No, we can\'t. This is going to be terrible.\"')" >
各种浏览器可能会或可能不会正确处理。接近它的很多更好的方法是给元素一个id(或一个类,或者你选择它的其他方式),然后从独立脚本中将鼠标悬停在处理程序上。 / p>
答案 1 :(得分:4)
由于你正在做的事情的结构:
onMouseOver="Tip('string here')"
...你必须做两个的事情:
正如Lekensteyn所说,你需要使用htmlspecialchars
将任何特殊的HTML字符转换为字符转义符。它可以将"
转换为"
,这意味着您可以安全地将该属性括在"
个字符中。
但是你不只是将它作为一个属性,你也将它放在一个字符串文字中,这意味着你还需要对字符串进行JavaScript转义。否则,(在您的情况下)单个'
字符或反斜杠会弄乱字符串。因此,您的jschars
函数还需要(按顺序)A)将\
转换为\\
,B)将'
转换为\'
。这是最小的,无论如何,你真的需要一个彻底的“让这个安全放入JavaScript文字”功能。从你的问题来看,我有一种你手动做的印象,但最好自动化它以保持一致性。
偏离主题:另外,我建议不要使用属性来附加处理程序。相反,请查看attachEvent
(IE)和addEventListener
(W3C),或者更好地查看类似jQuery,Closure,Prototype,{{ 3}}或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);
答案 2 :(得分:3)
您应该使用htmlspecialchars()
来实现此目的。问题是“,但HTML不会理解javascript引用,因此它会停在\"
。
function jschars($str) {
echo htmlspecialchars(preg_replace("/\r?\n/", "\\n", $str), ENT_QUOTES);
}
答案 3 :(得分:0)
您可以将字符串保留为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];
}