我有一个带有选项变量的 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/