jquery parseHTML没有按预期工作

时间:2013-04-29 23:31:34

标签: jquery html json parsing jsonp

我从jsonp调用中获取json数据。数据恢复正常。一个数据元素是字符串形式,其中包含一些html(“p”标记,“a”标记)。我正在尝试在jQuery对话框中输出此元素(图片描述)。出于某种原因,我无法将其渲染为html,无论我是否使用$ .parseHTML。

代码段:

var image       = data.image;
var title       = data.title;
var id          = data.id;
var description = $.parseHTML( data.description );
var media       = data.media;
var secret      = data.secret;
if(media == "photo"){
    var string  = "<div id=\"picturebox\" class=\"picturebox\">\n";
    string += "    <img src=\""+image + "\" id=\"photo_"+id+"\" />\n";
    string += "    <h2>" + title + "</h2>\n";
    string += "    <p>" + description + "</p>\n";
    string += "</div>\n";
    $('#gbFullPic').html(string);
}

虽然动态生成的div正确显示,包括图像和标题,但“description”行输出如下:     [对象文字]

如果我删除$ .parseHTML,输出如下所示:

Bird of paradise growing in south Florida.<p><a href="http://www.popgnology.com/guestbook.php">ACME Adventures</a></p>

如果我的html输出没有显示实际的html标签,那当然没问题。我做错了什么?

更新(第2次修订): 我以前的解决方案不完整。问题比单个jquery或javascript解决方案更复杂。

问题始于服务器端,通过

发送的格式错误的html
header('content-type: application/json; charset=utf-8');
echo $cid . '('.json_encode($data).')';
  • 在服务器端(PHP),我不得不调整我的“描述”项,就像这样(注意添加htmlspecialchars_decode和addslashes包装器):

      if($k == "description"){ 
        $data["$k"] = addslashes(htmlspecialchars_decode($v));
      }
      else{
        $data["$k"] = $v;
      }
    
  • 然后,这个javascript正确呈现了json数据项:

    var description   = data.description.replace('\\','');
    

通过在服务器页面上更正传递格式的两步过程,以及在客户端使用.replace剥离斜杠,“description”正确显示html页面上的所有text和html元素。

2 个答案:

答案 0 :(得分:4)

尝试var description = $($.parseHTML(data.description)).html();

jQuery的parseHTML返回一个DOM节点数组。然后你可以将它们插入到DOM中,但在你的情况下你应该得到他们的.html()并将它添加到你的字符串中。

答案 1 :(得分:4)

我的猜测是你的data.description被转义,方法parseHTML不会处理它。查看此帖子以获得解决方案:

Javascript decoding html entities

var text = '&lt;p&gt;name&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:xx-small;"&gt;ajde&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;da&lt;/em&gt;&lt;/p&gt;';
var decoded = $('<div/>').html(text).text();
alert(decoded);

所以在你的情况下:

var decoded = $('<div/>').html(data.description).text();
$('#gbFullPic').html(decoded);