【问题标题】:Generate LI with Json Objects get from PHP使用从 PHP 获取的 Json 对象生成 LI
【发布时间】:2012-09-13 09:29:39
【问题描述】:

我有一个小问题。我使用 jQuery 从$.get() 请求中获得了 json 数据

这是输出:

[
    {"name":"Silver","price":525,"per_month":"20","first_invoice":"20"},
    {"name":"Gold","price":500,"per_month":"50","first_invoice":"0"},
    {"name":"Avion","price":750,"per_month":"10","first_invoice":"10"}
]

我尝试为每个对象生成一个带有 LI 的 UL...

我写了这个小代码:

//send get request
    $.get(
        url, 
        { 'dst': dst, 'price':price },
        function(data) {

            var objects = jQuery.parseJSON(data);

            var items = [];

            jQuery.each(objects, function(){
                console.log(this);

                items.push('<li id="' + this.name + '">' + this.price + '</li>');
            }); 

            jQuery('<ul/>', {
                'class': 'my-new-list',
                html: items.join('')
            }).appendTo('#results');                
        }
    );

当我使用 console.log()each 对象时,firebug 会记录:没有错误...它可以工作。

这是items.push()appendTo(),它们什么都不产生...控制台中没有错误...在我的#results div 中没有附加...

我确定我做错了什么。谁能帮帮我?

更新

在 Fabrício Matté(稍后回答)的帮助下,问题出在 iframe。

jQuery('<ul/>', {
                'class': 'my-new-list',
                html: items.join('')
            }).appendTo(jQuery('body').find('#results'));  

有效 =)

很快再见 Stackoverflow 社区

【问题讨论】:

  • 对我来说很好用:jsfiddle.net/WaDkT.
  • 是的,它似乎与原始代码一起工作得很好。确保您的 #results 在 DOM 中,并且您的 console.log 显示您的期望。

标签: jquery json parsing get


【解决方案1】:

编辑: 根据 João 的评论,您的原始代码运行良好。确保:

  1. 当您尝试追加数据时,#result 在 DOM 中;
  2. jQuery.parseJSON(data) 返回一个对象数组;
  3. jQuery 已正确包含,并且在执行该行之前没有语法错误;
  4. 我稍微重写了代码以使其更易于阅读:

    var objects = jQuery.parseJSON(data);
    
    var items = '';
    
    jQuery.each(objects, function(){
        items += '<li id="' + this.name + '">' + this.price + '</li>';
    }); 
    
    jQuery('<ul/>', {
        'class': 'my-new-list'
    }).html(items).appendTo('#results');
    

Fiddle


编辑

根据 OP 的评论,您不能使用选择器来选择 iframe 内的元素,而无需先引用其 document。以下是我使用 contents()find() 的方法:

//replace the $('iframe') with ID/class selector if possible
jQuery('iframe').contents().find('#results').append(jQuery('<ul/>', {
    'class': 'my-new-list'
}).html(items));

Fiddle

请注意,如果 iframe 文档来自不同的主机、端口或协议,这将不起作用。
Same Origin Policy reference

【讨论】:

  • 它确实更容易阅读,但我认为这不是问题的原因。
  • 嗯,我在小提琴中测试了原始代码,它似乎没有工作。我会检查它以检查我还更改了什么,如果有的话。
  • 正如我在上一条评论中所说,您的清单中的数字 1,2 和 3 对我来说还可以。唯一的问题是页面在 Fancybox 创建的“iframe 元素”中工作......也许 dom 不能在 iframe 中写入?
  • @Raphaël 哦,我明白了。可以,但不是通常的方式。 #results 在 iframe 内部,而您正试图从外部写入?在这种情况下,您应该执行$('iframe').contents().find('#results') - fiddle 之类的操作(当然,如果您可以从 ID 或类中获取 iframe,那就更好了)。 注意:如果 iframe 由于同源策略来自另一个域,这将不起作用,在这种情况下,如果没有一些不推荐的非常丑陋的 hack,您将无法做到这一点。跨度>
  • @FabrícioMatté :你拯救了我的一天......而不是appendTo('#results') 我写jQuery('body').find('#results') 它就像一个魅力。我用答案更新我的答案。我不知道这个功能 =)
【解决方案2】:
$('<ul>')
    .addClass('my-new-list')
    .html($.map(objects, function(el) {
        return '<li id="' + el.name + '">' + el.price + '</li>';
    }).join("\n"))
    .appendTo('#results');

【讨论】:

  • 抱歉,这不能回答我的问题 =)
猜你喜欢
  • 2021-07-05
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
相关资源
最近更新 更多