javascript - 在回显时连接 PHP 和 JS

标签 javascript php escaping concatenation

我有一个带有选项变量的 JS,如下所示:

$output .= 
        '<script type="text/javascript">
         // <![CDATA[

                var options = {
                        render: "canvas", 
                        size: "100",
                        radius: "0.5",
                        };

         // ]]>
         </script>';

但是我需要使用 PHP 变量输出它( echo ),并且它不能位于单独的文件中,因此我使用点 的正常连接来进行输出。 例如'.$var.'但是由于我的 JS 需要双引号 " 我也将它们放入混合中,从而形成双单引号序列。

var options = {
        render: "'.$q_render.'", // Canvas, Div ,Image
        size: "'.$q_size.'",
        radius: "'. $q_corner_r.'",
        };

就我的测试而言,它有效。

当我需要将 $q_corner_r 的特定值乘以一个因子时,绘图会变厚:

var options = {
        render: "'.$q_ender.'", // Canvas, Div ,Image
        size: "'.$q_size.'",
        radius: "'. ($q_corner_r )* 3 .'",
        };

这也有效。 但真正的问题是我需要是一个十进制值,因此需要乘以一个小数因子。

var options = {
        render: "'.$q_ender.'", // Canvas, Div ,Image
        size: "'.$q_size.'",
        radius: "'. ($q_corner_r )* 0.3 .'",
        };

此时,PHP 会抛出错误,因为就其所知,0.3 中的小数点实际上是结束连接点。

我对这个问题的外行解决方案是将问题包装在 json_encode() 中,然后将其赤裸裸地毫无防备地投入战斗。

radius: "'. json_encode( ($q_corner_r )* 0.1 ) .'",

令人惊讶的是,它工作正常。

所以现在一切正常(不要 panic ) - 但我的疑问仍然存在。

遇到这种情况我该如何处理? (我知道我可以在 JS 之前在 PHP 中执行 $qr_corner_r = ($qr_corner_r )* 0.1 ..但是我应该吗?)

我的代码能够工作只是因为纯粹的运气(或愚蠢,或两者的结合)。

是否有其他解决方案/方法适合这些情况?

我们只是观察到一个简单的“错误转义”案例吗? (或者在我的例子中根本没有转义)

最佳答案

您的主要问题是假设 JavaScript 需要用引号括住其值,这仅对于字符串值是必需的,对于数字(尤其是您将在计算中使用的数字),您应该将它们不加引号。

$output .= 
  '<script type="text/javascript">
   // <![CDATA[

    var options = {
      render: "canvas", 
      size: 100,
      radius: (' . $q_corner_r . ' * 0.3)
    };

   // ]]>
   </script>';

这样,JavaScript 会将它们解释为 Number 类型,允许您执行数学计算,而不必依赖 JavaScript 将字符串值转换回数字,否则会产生不确定的结果。

通常,如果您发现自己对转义或多级引号感到困惑,最好重新考虑您的方法。通过对整个 PHP 对象进行 json_encoding 并在 PHP 端执行乘法,可以轻松处理上述问题。

$data = (object) array(
  'render' => 'canvas',
  'size' => 100,
  'radius' => ($q_corner_r * 0.3),
);

$output .= 
  '<script type="text/javascript">
   // <![CDATA[

    var options = ' . json_encode($data) . '

   // ]]>
   </script>';

关于javascript - 在回显时连接 PHP 和 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20738437/

相关文章:

javascript - 在谷歌地图上添加标记左键单击。试图修改一个例子

javascript - 简单的方法导航栏 Bootstrap

javascript - 通过ajax加载openx横幅

javascript - Twitter API 接受关注请求

javascript - .textContent 是否完全安全?

javascript - 在 Chrome 和 Edge 之间拖放 HTML

php - 不能要求 laravel/passport 与 Composer

windows - 批处理文件 : Escape questionmark in for loop

c# - 如何将未处理(转义)的单词放入 String.Format

php - 在 PHP 中播种随机数生成器