繁体   English   中英

引号内的javascript引号,字符串文字问题

[英]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('\&quot;No, we can\'t. This is going to be terrible.\&quot;')" >

各种浏览器可能会或可能不会正确处理。 一个更好的方式来处理这将是给元素的ID(或一类,或者一些其他的方法可以让你选择它),然后在处理从一个独立的脚本中添加鼠标。

由于你正在做的结构:

onMouseOver="Tip('string here')"

......你必须做件事:

  1. 正如Lekensteyn所说,你需要使用htmlspecialchars将任何特殊的HTML字符转换为字符转义。 它会像"转入&quot; ,这意味着您可以安全地将属性括在"字符”中。

  2. 但是你不只是将它作为属性使用,你将它放在一个字符串文字中,这意味着你还需要对字符串进行JavaScript转义。 否则,(在你的情况下)单个'字符或反斜杠会弄乱字符串。 所以你的jschars函数也需要(按顺序)A)将\\转换为\\\\ ,B)将'转换为\\' 这是最小的,无论如何,你真的需要一个彻底的“让这个安全放入JavaScript文字”功能。 从你的问题来看,我有一种你手动做的印象,但最好自动化它以保持一致性。

偏离主题 :另外,我建议不要使用属性来附加处理程序。 相反,请查看attachEvent (IE)和addEventListener (W3C),或者更好地查看一个类似jQueryClosurePrototypeYUI其他任何可以为您解决问题的库。 例如,将鼠标悬停处理程序附加到:

您可以使用此处理程序来处理鼠标悬停:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM