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

时间:2010-10-30 08:41:55

标签: php javascript string

我正在尝试在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;” - 我仍然得到错误

4 个答案:

答案 0 :(得分:12)

这是因为你将双引号放在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(或一个类,或者你选择它的其他方式),然后从独立脚本中将鼠标悬停在处理程序上。 / p>

答案 1 :(得分:4)

由于你正在做的事情的结构:

onMouseOver="Tip('string here')"

...你必须做两个的事情:

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

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

  3. 偏离主题:另外,我建议不要使用属性来附加处理程序。相反,请查看attachEvent(IE)和addEventListener(W3C),或者更好地查看类似jQueryClosurePrototype,{{ 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];
}