【问题标题】:jQuery/JS Output from array/loop来自数组/循环的 jQuery/JS 输出
【发布时间】:2012-09-28 23:28:56
【问题描述】:

我在一个页面上有几个链接,它们用 jQuery 变成了一个数组。基本上,当用户在页面上单击“加载更多”时,我想生成一个<ul>,里面有 4 个图像(如果没有剩余 4 个图像,则更少。然后我需要关闭</ul>。我想不通不知道我会怎么写,有人知道吗?另外,这段代码可以吗?还是应该以某种方式整理一下?

真正喜欢的是一种在加载时隐藏 4 张图片然后向下滑动新的 <ul> 的方法,但我不知道怎么做,因为我不知道在哪里我可以在那里写一个回调函数。如果您知道如何,请随时为我指明正确的方向!

到目前为止我的代码;

var hrefs = jQuery.makeArray(jQuery('ul.js a'))

        jQuery('#load_more').bind('click',function(){

            jQuery('.img_gallery').append('<ul>')
            for(var c = 0; c < 4; c++){
                if((hrefs.length) > 0){
                jQuery('<li>').append(jQuery('<img>', {src:hrefs[0]})).appendTo(jQuery('.img_gallery'))
                hrefs.splice(0,1)
                }
            }
            jQuery('.img_gallery').append('<ul>')
        })

谢谢:)

【问题讨论】:

  • 您可以用 $ 符号替换几乎所有 JQuery 调用,这使您的代码更清晰。
  • 是的,我知道,我开始编写没有美元符号的其他脚本,但一旦完成,我会整理出来(如果我完成了!)
  • 请不要忘记在每行完整代码的末尾添加分号。它可能对解析器没有任何影响,但它使您的代码更易于阅读。

标签: javascript jquery for-loop append


【解决方案1】:

当您使用 jQuery 时,您不是在附加 html tags,而是在附加 html elements

当您执行$('.img_gallery').append('&lt;ul&gt;'),然后执行$('.img_gallery').append('&lt;li&gt;') 时,您最终会得到这样的结构:

<div class="img_gallery">
    <ul></ul>
    <li></li>
</div>

您不必担心关闭标签,只需创建元素。 jQuery 在某种意义上为您“关闭”了所有标签。您需要将li 元素附加到ul,而不是.img_gallery。只需附加到最后一个ul

var hrefs = $.makeArray(jQuery('ul.js a'))

$('#load_more').bind('click',function(){
    $('.img_gallery').append('<ul>');

    for(var c = 0; c < 4; c++){
        if((hrefs.length) > 0){
            $('<li>').append($('<img>', {
                src: $(hrefs[0]).attr('href'); // get the link reference from the element
            })).appendTo($('.img_gallery ul').last());  // append to the last ul, not .img_gallery
            hrefs.splice(0,1);
        }
    }
});

或者,您可以将 ul 保留为变量,添加您的 li 并在循环后附加列表:

var hrefs = $.makeArray(jQuery('ul.js a'))

$('#load_more').bind('click',function(){
    var newul = $('<ul>');  // Makes an element, not a tag

    for(var c = 0; c < 4; c++){
        if((hrefs.length) > 0){
            $('<li>').append($('<img>', {
                src: $(hrefs[0]).attr('href'); // get the link reference from the element
            })).appendTo(newul);  // append to the ul you created
            hrefs.splice(0,1);
        }
    }

    $('.img_gallery').append(newul);
});

【讨论】:

【解决方案2】:

您的 hrefs 数组包含 DOM 元素,而不是 URL。试试这个:

var hrefs = jQuery.map(jQuery('ul.js a'), function(el,i) {
    return $(el).attr('href');
});

顺便说一句,您可以按如下方式优化您的 for 循环:

for (var c = 0; c < 4; c++) {
    if (hrefs.length) {
        jQuery('<li>').append(jQuery('<img>', {
            src: hrefs.shift() // removes and returns the first array element
        })).appendTo(jQuery('.img_gallery'));
    };
};​

【讨论】:

  • 这很奇怪,当我的数组充满链接时,它怎么会起作用?!我写错了,应该是var hrefs = $.makeArray(jQuery('ul.js a').attr('href'))吧?
  • $.makeArray(jQuery('ul.js a').attr('href')) 将为您提供一个仅包含一个元素的数组,即第一个链接的 href。您需要使用jQuery.map 来构建完整的数组。
  • 只需根据需要使用.append().appendTo()。其他你可能还没学过的方法见this page
【解决方案3】:

试试这个方法..这样更干净

var hrefs = jQuery.makeArray(jQuery('ul.js a'))

jQuery('#load_more').bind('click', function() {
    var html = '<ul>'
    for (var c = 0; c < 4; c++) {
        if ((hrefs.length) > 0) {
            html += '<li><img src="' + hrefs[0] + '" /></li>' ;
            hrefs.splice(0,1);
        }
    }
    html += '</ul>'        
    jQuery('.img_gallery').append(html )
})​

【讨论】:

  • 不,它做我想要的,因为我使用第一个,然后每次将它从数组中拼接出来。好吧,这就是我得到它来做我需要的事情的方式..
  • 看起来不错,但我还需要接头吗?基本上它有 50 个项目,我需要一次输出 4 个,直到它为空......
  • 您可以根据您的要求删除c并添加拼接..编辑代码..如果您想在页面加载时隐藏它..只需写这个$('ul')。隐藏()
  • 你为什么使用原始 html,而不是使用 jQuery 创建元素?
  • 我认为一次性插入元素比在每次迭代中追加元素要快..
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2020-03-06
  • 2019-03-18
相关资源
最近更新 更多