Javascript 在回显时连接PHP和JS
我有一个JS和一个选项变量,如下所示:Javascript 在回显时连接PHP和JS,javascript,php,escaping,concatenation,Javascript,Php,Escaping,Concatenation,我有一个JS和一个选项变量,如下所示: $output .= '<script type="text/javascript"> // <![CDATA[ var options = { render: "canvas", size: "100", radius: "
$output .=
'<script type="text/javascript">
// <![CDATA[
var options = {
render: "canvas",
size: "100",
radius: "0.5",
};
// ]]>
</script>';
在我的测试中,它一直有效
当我需要将$q\u 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 ) .'",
非常令人惊讶的是,它的效果还不错
所以现在一切都正常了(不要惊慌)——但我的怀疑仍然存在
我该如何处理这种情况?(我知道在JS之前我可以用PHP做$qr\u corner\u r=($qr\u corner\u r)*0.1
。但我应该吗?)
我的代码只有在纯粹的运气(或愚蠢,或两者兼而有之)下才能工作
是否有其他适合这些情况的解决方案/方法
我们仅仅是在观察一个糟糕的“错误逃跑”案例吗?(或者在我的例子中根本没有转义)答案是将代码更改为如下所示:
var options = {
render: "'.$qr_ender.'", // Canvas, Div ,Image
size: "'.$q_size.'",
radius: "'. ($q_corner_r * 0.3) .'",
};
您添加了()
,但仅在变量周围添加,这使它们变得无用
实际上,您正在执行数学运算,因此通过添加()
,您将在其余运算之前隔离要计算的那部分数学运算,这与在任何其他数学情况下一样。尝试:
$var = ($q_corner_r* 0.3);
$str ="
var options = {
render: "'.$q_ender.'", // Canvas, Div ,Image
size: "'.$q_size.'",
radius: "'. $var .'",
};
";
您的主要问题是假设JavaScript需要将其值用引号括起来,这仅适用于字符串值,对于数字-尤其是您将在计算中使用的数字-您应该让它们不带引号
$output .=
'<script type="text/javascript">
// <![CDATA[
var options = {
render: "canvas",
size: 100,
radius: (' . $q_corner_r . ' * 0.3)
};
// ]]>
</script>';
除了JSON编码之外,其他都是。他的代码中的JSON编码实际上没有做任何事情,它只是因为它的
()
而导致了一个单独的执行范围。(JSON编码一个数字就是一个数字)你有没有注意到整个东西已经在一个php字符串中了??更不用说,在JS$qr\u corner\u r=($qr\u corner\u r*0.3)
格式错误的代码示例之前,我已经在问题中写到了我可以在PHP中实现它。。。让我困惑。。。sry!就这么做了吗?为什么要忙着用不可读的连接呢?谢谢,这实际上是一个很好的答案。对我来说,将整个选项作为一个对象传递确实会好得多。。
$output .=
'<script type="text/javascript">
// <![CDATA[
var options = {
render: "canvas",
size: 100,
radius: (' . $q_corner_r . ' * 0.3)
};
// ]]>
</script>';
$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>';