我想在一个选择框中显示700个产品数据,每个选择我必须打印一个描述表。在我做ajax调用并显示数据之前,但进程很慢。所以我必须将所有数据发送到客户端,然后使用javascript更改选项更改的描述表。以下是我的代码
<?php
$data = json_encode( get_data_from_db() );
?>
<input type='hidden' name='data' id='data' value= " <?php echo $data; ?>" />
当我在jquery中发出警报时
alert( $("#data").val() );
我只看到
警报中的{[
值,但是当我在浏览器上打印数据时,它确实以json格式打印。
我怎样才能在javascript中获取这些数据,然后我必须使用循环来提取针对特定id的数据,并将其从中删除然后嵌入它。请建议正确的方法,警告有什么不对。感谢
答案 0 :(得分:2)
另一种解决方案 - 不是创建全局变量,而是将该数据设置为某些相关元素的data-
属性。不要忘记在整个数组/对象上执行json_encode()
,然后在结果字符串上执行htmlspecialchars()
(正如其他人所指出的那样,缺少htmlspecialchars()
就是为什么你只有“{[”当警告输入字段的值时)。在调用ENT_QUOTES
时,请不要忘记指定htmlspecialchars()
,否则如果任何值包含撇号字符,则结果可能无效。
<?php
$users = array(
array('name' => 'Average', 'surname' => 'Joe'),
array('name' => 'Average', 'surname' => 'Jane'),
array('name' => 'Joe', 'surname' => 'Sixpack'),
array('name' => 'John', 'surname' => 'Doe'),
array('name' => 'Hong', 'surname' => 'Gildong'),
array('name' => 'Foo', 'surname' => 'Bar'),
);
?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<title>sandbox</title>
<meta http-equiv='content-type' content='text/html; charset=UTF-8'/>
<script type='text/javascript' src='js/jquery-1.6.1.min.js'></script>
</head>
<body data-users='<?php echo htmlspecialchars(json_encode($users), ENT_QUOTES); ?>'>
<script type='text/javascript'>
$(function() {
var users = $(document.body).data('users');
for ( var n in users ) {
$('<div/>').text(users[n].name + ' ' + users[n].surname).appendTo(document.body);
}
});
</script>
</body>
</html>
这使得6个<div/>
元素的所有名称和姓氏都作为其内容。
答案 1 :(得分:1)
您遇到的问题是您在value
属性周围使用双引号,但当然JSON输出中的所有键和字符串都是双引号,第一个终止{{ 1}} HTML中的属性。
不要输出value
作为隐藏元素的值。而是将其输出到JavaScript变量:
$data
然后,您可以直接在JavaScript中使用<script>
var products_data = <?php echo $data; ?>;
</script>
。 (如图所示,它是一个全局变量,这不是理想的;如果你可以在一个范围函数中包含它,那会更好,但这取决于你的脚本等组织方式。)
这是有效的,因为JSON是JavaScript对象文字格式的子集,因此有效的JSON也是用于定义内联对象的有效JavaScript。您的PHP将生成类似的内容并将其发送到浏览器:
products_data
显然,确切的结构将取决于您的服务器端<script>
var products_data = {
"products": [
{"id": 427, "name": "WonderWidget", "price": 27.99},
{"id": 429, "name": "CoolNiftyThing", "price": 19.99}
]
};
</script>
对象。
答案 2 :(得分:0)
原因是json编码数组的格式是这样的:{[ "value1","value2",...]}
,所以,当你echo
“value”字段中的字符串时,json中的第一个双引号
string关闭隐藏输入的value属性
解决问题你可以做点什么
<script>
var myData = <?php echo json_encode( get_data_from_db() ); ?>
</script>
答案 3 :(得分:0)
@ T.J。克劳德对你的钱有你的答案。
您在发布的示例中看到奇怪行为的原因可能是因为您的json_encode
在早期有双引号,并且在注入标记属性而没有转义字符时它正在炸毁dom
答案 4 :(得分:0)
这样做的最佳方式是不会直接将JSON结构回显到脚本中(这可以打开您htmlspecialchars
可能无法保护您的XSS问题。)
我建议您执行以下操作:
<script type="text/plain" id="json_data">
<?php echo html_special_chars(json_encode($data)); ?>
</script>
<script>
var myData = $.parseJSON($("#json_data").text());
</script>
JSON 不是 Javascript,不应该这样对待。
答案 5 :(得分:-2)
不是 val(); 使用 text();
alert($("#data").text());