0

我正在运行一个 ajax 查询并返回 JSON,其中一个结果是一个名为image.commenteg

test~63~Dave Sanders~http://graph.facebook.com/998433599/picture?type=large~Dave Sanders~9 minutes ago

~用作分隔符

可能有多个类似的数据集由----in分隔,image.comment以便解析数据并将其添加到我正在使用的 DOM 中:

if(image.comment){

        html += '<div class="msgs_holder'+image.list_id+'">';

        // split comment at ----        
        var comString = image.comment;
        var comArray = comString.split("----");

        var lengthArray = comArray.length,
        element = null;

        for (var i = 0; i < lengthArray; i++) {
            element = comArray[i];

            // split indiv comment at ~     
            var comUserString = element;
            var comUserArray = comUserString.split("~");

            html += '<div class="msgs_row"><div class="msgs_pic"><a href="/'+comUserArray[4]+'"><img src="'+comUserArray[3]+'"></a></div>';
            html += '<div class="msgs_comment"><a href="/'+comUserArray[4]+'" style="text-decoration:none;"><span class="msgs_name">'+comUserArray[2]+'</span></a> '+comUserArray[0]+'<br><span class="msgs_time" title="'+comUserArray[5]+'">'+comUserArray[5]+'</span></div></div>';

        }

        html += '</div>';

    }

但是页面无法加载,firefox firebug 告诉我:allocation size overflow

这仅发生在列中有数据的 JSON 行comment

我怀疑有些可能是无限循环但看不到

我检查了查询,它运行良好,所以不是

这是在js中爆炸的最佳方式吗?

有任何想法吗?

更多信息我这样做的原因是它是一个更大的查询的一部分。加载到页面的图像,每个图像下都有评论。因此,我将评论加载到要解析的列中以供显示。

例子:

Image 1        Image 2        Image 3                       etc etc etc
hey                           i think its great!
hey back!                     me too
                              I'm not sure

更多信息 2此数据取自 MySQL 查询,例如

select w.img_width, w.img_height, w.prod_pic_url as preview3,
        GROUP_CONCAT(ww.comment,'~', h.user_id,'~', h.name,'~', 
        h.live_prof_pic,'~', h.twovo_url,'~', time_ago(ww.dateadded) SEPARATOR '----') AS comment 
        from tableName where blah=blah

GROUP_CONCAT 是上面提到的评论部分

那么,将 JSON 用于数据中的数据,这可能吗?如果有怎么办?

返回数据示例:

"preview3":"http:\/\/myurl.com\/wish_images\/production\/3578.jpg","comment":"test~63~Dave Sanders~http:\/\/graph.facebook.com\/Dave Sanders\/picture?type=large~Dave Sanders~39 minutes ago"},{"item_id":"3559","numComms":"0","numLikes":"0"... etc etc
4

2 回答 2

6

这不适合发表评论,所以我将尝试写下我认为人们关于使用 JSON 而不是字符串的说法:

这个:

test~63~Dave Sanders~http://graph.facebook.com/998433599/picture?type=large~Dave Sanders~9 minutes ago

可以变成这样:

[
    {
        'name': 'test',
        'id': 63,
        'name': 'Dave Sanders',
        'url': 'http://graph.facebook.com/998433599/picture?type=large',
        'when': '9 minutes ago'
        // other properties
    },
    {
        // the next one
    },
    {
        // etc.
    }
]

它可能看起来需要更多的工作,但您可以使用一些 JSON 库用于 php(我猜,因为您使用术语“explode”)在服务器上构建 JSON。然后,您返回的内容已经以一种形式供您基于浏览器的客户端应用程序使用,无需额外的努力。我发现很难想象这最终会比您尝试对字符串操作所做的工作更多,而且 JSON 可能不那么脆弱。

于 2013-03-18T20:03:39.873 回答
2

根据您更新的问题...

您仍然可以为此使用 JSON。我认为它可能会帮助您阅读JSON 规范

添加到 Chris Farmer 的答案中,JSON 也可以由数组组成,因此您可以在响应中嵌套您的评论:

var response = [
  {
    'name': 'test',
    'id': 63,
    'name: 'Dave Sanders',
    'url': 'http://graph.facebook.com/998433599/picture?type=large',
    'comments' : [
       'comment1',
       'comment2',
       'comment3',
       ...
    ]
  },
  ...
]

然后,您可以像这样循环浏览评论:

// loop through the images
for ( var i = 0;  i < response.length; i++ ) {

    var image = response[i];

    // loop through the comments
    for ( var z = 0;  z < response.length; z++ ) { 
        var comment = image.comments[z];
        // insert HTML here.
    }
}

您是否看到这比您当前的方法更容易和更少冗长?

不幸的是,从长远来看,为了让自己更容易做到这一点,您不得不重新编写后端代码。但是,这将教您使用 JSON 传输信息的好处和力量。

于 2013-03-18T20:25:21.803 回答