2011-06-07 81 views
1

我想在选择框中显示700个产品数据,并且每次选择时我必须打印一张描述表。在我进行ajax调用并显示数据之前,这个过程很慢。所以我必须将所有数据发送到客户端,然后使用javascript更改选项更改的描述表。下面是我的代码如何在javascript中获取数据通过php mysql查询

<?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和使ul里出来,然后嵌入它。请提出正确的方法和警报的错误。谢谢

回答

2

另一种解决方案 - 而不是创建全局变量,设置一些相关元件的data-属性数据。不要忘了整个数组/对象进行json_encode()和生成的字符串,然后htmlspecialchars()(正如其他人所指出的,缺乏htmlspecialchars()就是为什么你只得到了原因,“{[”报警输入字段的值时)。当调用htmlspecialchars()时,不要忘记指定ENT_QUOTES,或者如果任何值包含撇号字符,则可能会得到无效结果。

<?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

你遇到的问题是你使用双引号围绕value属性,但当然JSON输出中的所有键和字符串都用双引号引起来,第一个引号终止了value属性。 HTML。

不要输出$data作为隐藏元素的值。而是将其输出到JavaScript变量:

<script> 
var products_data = <?php echo $data; ?>; 
</script> 

然后,您可以直接在您的JavaScript中使用products_data。 (如图所示,这是一个全局变量,这并不理想;如果您可以将其包含在范围函数中,那会更好,但这取决于您的脚本等的组织方式。)

JSON是JavaScript对象字面格式的一个子集,因此有效的JSON也是用于定义内联对象的有效JavaScript。你的PHP会产生这样的事情,并将其发送到浏览器:

<script> 
var products_data = { 
    "products": [ 
     {"id": 427, "name": "WonderWidget", "price": 27.99}, 
     {"id": 429, "name": "CoolNiftyThing", "price": 19.99} 
    ] 
}; 
</script> 

显然确切结构将取决于你的服务器端$data对象。

+0

谢谢冠军,我放弃了。第一 – 2011-06-07 07:19:21

0

的原因是,JSON编码数组的格式是这样的:{[ "value1","value2",...]},所以,当你echo“价值”里面的字符串字段的JSON 字符串的第一个双引号关闭隐藏输入

的value属性

解决,你可以做这样的事情

<script> 
var myData = <?php echo json_encode(get_data_from_db()); ?> 
</script> 
-2

VAL问题(); 使用text();

alert($("#data").text()); 
0

@ T.J。克劳德在金钱上有你的答案。

你看到在您发布的例子怪异行为的原因可能是因为你的json_encode有双引号早期,当注入标签属性,而不转义字符

0

以最好的方式是炸毁DOM这样做不会直接将JSON结构回显到脚本中(这可能会导致您遇到XSS问题,htmlspecialchars可能无法保护您)。

我建议做以下几点:

<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和不应该被如此对待。

相关问题