当返回的数据包含HTML标记时,JSON会搞乱

时间:2009-09-13 02:17:33

标签: php jquery json

我有一个返回JSON对象的PHP页面,如下所示:

  header('Content-Type:application/json');
  echo <<<HERE_DOC
      [ {content: '{row2[contentFull]}', bigimages: '{$row3['catalogFileID']}'}]
      HERE_DOC;

在我的主页面中,我有以下jQuery代码:

jQuery(function()
{
  jQuery("select#rooms").change(function()
  {
    var options = '';

    jQuery.getJSON("/admin/selection_about.php",{id:jQuery(this).val(), 
                   ajax:isAjax}, function(j)
    {
       for (var i = 0; i < j.length; i++) 
       {
          options = j[i].topImage;
          document.getElementById('content1').value = j[i].bigimages;
       }
    })
  })
})

所以基本上在我的主页面上,我有一个下拉菜单。选择一个选项后,它会将Ajax请求发送回服务器。我以JSON格式获取数据,然后基于该JSON对象更新ID为“content1”的textarea。

JSON对象如下所示:

[ 
  {  
     content: '<SPAN STYLE= "" >&quot;
     this is some text&quot; 
     blah blah, &quot;
     some more `text&quot;  
     now some linebreaks; 
     <BR><BR>some more text and then another` linebreak.`<BR>`</SPAN>',
     bigimages: 'cfil1069'
   }
]`

但是这里发生了错误,我的textarea没有更新。但是,如果我硬编码要在JSON对象中返回的简单文本,那么我的textarea就会更新。

JSON对象中的数据是否应该没有HTML标记?

编辑:

根据建议,我将代码更改为以下PHP代码:

$arr = array ('content'=>$rest1,'bigimages'=>$row3['catalogFileID']);
echo json_encode($arr);

但现在我的jQuery代码:

j的长度是'未定义'......

    jQuery.getJSON("/admin/selection_about.php",{id: jQuery(this).val(), 
                   ajax: isAjax}, function(j)
    {
       alert('here3: ' + j.length); // this shows undefined

       for (var i = 0; i < j.length; i++) 
       {
          document.getElementById('content1').value = j[i].content;
       }
    })

1 个答案:

答案 0 :(得分:1)

将您的内容放入PHP数组中。然后使用json_encode()将其转换为JSON 这将安全地编码和转义字符,例如HTML属性中的双引号。

<强>更新

j.length不起作用的原因是:
带键的PHP数组不是Javascript数组。 Javascript数组没有键。因此,转换后,PHP数组将转换为JS对象。

要访问JS对象,您可以使用j.content,而不是使用j.length循环访问对象。 j.length未定义,因为对象j中没有属性名为length的属性(因为在PHP数组中没有$arr['length']