【问题标题】:javascript quotes inside quotes, string literal issue引号内的javascript引号,字符串文字问题
【发布时间】:2010-10-30 20:47:10
【问题描述】:

我正在尝试在 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.\"')"

这给了我提示中第一个 \ 的错误未终止字符串文字('\

我猜是因为我试图将引号直接放在单引号内,在这种情况下如何解决这个问题? (我已经尝试过 htmlspecial 字符,例如用 & 替换 " - 我仍然得到错误

【问题讨论】:

    标签: php javascript string


    【解决方案1】:

    这是因为您在 XML(或 html)元素的值中添加了双引号:

    <div onMouseOver="Tip('\".......
    

    反斜杠不会将其从 xml/html 的上下文中转义。从技术上讲,您需要对字符串进行实体编码(在 javascript 转义之后)。像这样的:

    <div onMouseOver="Tip('\&quot;No, we can\'t. This is going to be terrible.\&quot;')" >
    

    各种浏览器可能会或可能不会正确处理该问题。 很多更好的方法是给元素一个 id(或一个类,或其他方式让您选择它),然后从独立脚本中添加鼠标悬停处理程序。

    【讨论】:

      【解决方案2】:

      因为你正在做的事情的结构:

      onMouseOver="Tip('string here')"
      

      ...你必须做两件事

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

      2. 1234563否则,(在您的情况下)单个 ' 字符或反斜杠会弄乱字符串。所以你的jschars 函数还需要(按顺序)A)将\ 转换为\\,B)将' 转换为\'。这是最低限度的,无论如何,你真的需要一个彻底的“让它安全地放在 JavaScript 文字中”函数。从您的问题来看,我的印象是您是手动执行此操作,但最好将其自动化以保持一致性。

      题外话:另外,我建议不要使用属性来附加处理程序。相反,请查看 attachEvent (IE) 和 addEventListener (W3C),或者最好查看 jQueryClosurePrototypeYUIany of several others 之类的库出来给你。例如,将鼠标悬停处理程序附加到:

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

      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);
      

      【讨论】:

        【解决方案3】:

        您应该为此使用htmlspecialchars()。问题是“,但 HTML 无法理解 javascript 引用,因此它停在 \"

        function jschars($str) {
                echo htmlspecialchars(preg_replace("/\r?\n/", "\\n", $str), ENT_QUOTES);
        }
        

        【讨论】:

        • 无论如何,这解决了一半的问题。虽然从问题来看,我认为他已经手动处理了下半场。
        【解决方案4】:

        您可以将字符串保存在 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];
        }
        

        【讨论】:

          猜你喜欢
          • 2023-01-13
          • 2014-09-26
          • 1970-01-01
          • 2021-03-06
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多