我正在使用 PHP 和 MySQL 来遍历产品并生成 HTML 代码,该代码由一个 img 标记和一个调用 Javascript 函数的 onClick 事件组成。我想通过 onClick 事件将 PHP 变量传递给 Javascript 函数。我正在使用 jQuery,并认为使用 PHP 的 json_encode() 函数和 jQuery 的 jquery-json 插件是个好主意。
我的 PHP 代码如下所示:
$onclick = json_encode(array(
'productid' => $productsRow['ProductID'],
'description' => $productsRow['Description']
));
echo "<a href=\"javascript:;\" onClick=\"changepic('" . htmlentities($onclick) . "')\">";
echo "<img src=\"products/$thumbnailfilename\" width=\"100\" height=\"100\">";
echo "</a>";
如您所见,我的 Javascript 函数称为 changepic()。我遗漏了一些与这个问题无关的代码(即数据库访问代码和决定缩略图的位置)。
我的 Javascript 代码是:
function changepic(productarray) {
var productid = $.evalJSON(productarray).productid;
var productdesc = $.evalJSON(productarray).description;
alert(productid);
}
我还没有真正对传递给 Javascript 数组的 PHP 变量做任何事情,我只是想让它首先工作!我的最终目标是使用 jQuery 将产品描述插入到<div>
示例产品详细信息可能如下所示:
ProductID: 30c7508008ac7597619ad9b90a97b40f
Description: <p>Wide and Narrow Bands<br>
Set with Top-Quality Diamonds</p><p>
如您所见,描述包含 HTML 代码,以及<br>
标签后的换行符。
生成的 HTML 如下所示:
<a href="javascript:;" onClick="changepic('{"productid":"30c7508008ac7597619ad9b90a97b40f","description":"<p>Wide and Narrow Bands<br>\r\nSet with Top-Quality Diamonds<\/p>"}')"><img src="products/tn-30c7508008ac7597619ad9b90a97b40f.jpg" width="100" height="100"></a>
当我运行它时,我得到一个 Javascript 错误:
Event thread: click
Uncaught exception: SyntaxError: JSON.parse: Unescaped control char in string: "<p>Wid
Error thrown at line 18, column 2 in changepic(productarray) in http://isis/carats/view-collection.php?collectionid=32d0c7b8774f7f82a2d7c7d053286cfc:
var productid = $.evalJSON(productarray).productid;
called from line 1, column 0 in <anonymous function>(event) in http://isis/carats/view-collection.php?collectionid=32d0c7b8774f7f82a2d7c7d053286cfc:
changepic('{"productid":"30c7508008ac7597619ad9b90a97b40f","description":"<p>Wide and Narrow Bands<br>\r\nSet with Top-Quality Diamonds<\/p>"}')
据我所知,我在编码 JSON 字符串时做错了。我做了一些谷歌搜索,发现有些人说不需要编码(我试过了,产品描述被视为 HTML 并显示在页面中),其他人说使用 addlashes() 和一些人说 htmlentities()。
在尝试将其与 evalJSON() 一起使用之前,是否需要在 Javascript 函数中对其进行解码?