【问题标题】:Inserting images into DOM at specific intervals以特定间隔将图像插入 DOM
【发布时间】:2017-03-09 16:15:48
【问题描述】:

我在<section id="interview"> 中有一系列重复的<p class="question"><p class=answer>。在每第三个答案之后,我想插入一个图像,其路径名存储在一个数组中:

array = ['../../directory/file-1.jpg', '../../directory/file-2.jpg];

到目前为止,我有:

var interval = 3;
var questionCount = 9;
var imageCount = array.length;
var interview = $('#interview');
var self;

for (var i = interval; i < questionCount; i+=interval) {
    interview.find('p.answer:nth-of-type('+i+')').each(function() {
        self = $(this);
        for (var p = 0; p < imageCount; p++) {
            self.after('<img src="'+array[i]+'">');
        }
    });
}

当然,这是给我数组中每个间隔的所有图像,而不是第一个间隔的第一张图像,第二个间隔的第二张图像,依此类推。我需要如何更改它?

【问题讨论】:

    标签: javascript jquery for-loop nested-loops


    【解决方案1】:

    只需删除内部的for 循环。

    var j=0;
    for (var i = interval; i < questionCount; i+=interval) {
        var ans = interview.find('.answer').eq(i);
        ans.after('<img src="' + array[j] + '">');
        j++;
    }
    

    【讨论】:

    • 这似乎在每个间隔都给了我相同的图像,即数组中的第一个图像。我想在第一个间隔有第一张图片,第二张在第二张等等。
    • @Ryan 我编辑了代码。为数组添加了一个单独的索引变量。立即尝试。
    • 不幸的是,这似乎没有任何区别,结果和以前一样。
    • @Ryan 现在做了一些更改检查。
    • 不幸的是完全一样。您的解决方案使我在所有建议中最接近,但我仍然重复数组中的第一个图像,而不是第一个,然后是第二个,然后是第三个等。
    【解决方案2】:

    如果我理解正确,您希望在第三个之后获得数组中的第一张图像,在第六个之后获得第二张图像,等等。

    如果是这样,您几乎已经完成了,只需在吐出图像时放下循环并使用您所在的 p 的索引。

    var interval = 3;
    var questionCount = 9;
    var imageCount = array.length;
    var interview = $('#interview');
    var self;
    
    for (var i = interval; i < questionCount; i+=interval) {
        interview.find('p.answer:nth-of-type('+i+'n)').each(function() {
            self = $(this);
            self.after('<img src="' + images[i] + '">');
        });
    }
    

    如果您使用更多的 jQuery,实际上可以显着简化您的代码。

    var images = []; // images go here
    var interval = 3;
    $('#interview:nth-of-type(' + interval + ')').each(function (index) {
        $(this).after('<img src="' + images[index] + '">');
    });
    

    请注意,我使用了 each() 函数的 index,它让我很容易知道我在哪一组 3,我可以将其传递给 images 数组。

    这是我的快捷方式示例(使用消息而不是图像):

    const messages = [0,1,2,3,4,5];
    const interval = 3;
    
    $('p:nth-of-type(' + interval + 'n)').each(function (index) {
      $(this).after('<p>' + messages[index] + '</p>');
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>
    <p>A</p>

    【讨论】:

    • 我喜欢这种简化(为什么我没有想到这一点?),但是 undefined 在您的示例中被作为 img src 返回。
    • 对不起,我刚刚复制了您的代码并删除了循环。已更新,现在应该可以使用了。
    • 更新了,现在什么都没有了。我将$('#interview:nth-of-type(' + interval + ')') 更改为$('p.answer:nth-of-type(' + interval + ')') 认为这可能是解决方案,但不幸的是仍然没有改变。
    • 对不起,我有一些小失误。我在间隔之后添加了一个n(所以它就像3n)。我还将insertAfter 更改为after(如果我想使用insertAfter,我应该切换参数)。另外,indexeach 回调的第一个参数,而不是第一个。是的,编写未经测试的代码。 =p
    • 完美运行!
    【解决方案3】:

    试试这个:

    interview.find('p.answer:nth-of-type('+interval+')').each(function(index) {
            self = $(this);
            $('<img>').attr('src', array[index]).after(self)
        });
    

    并删除两个循环

    【讨论】:

    • 其实正确的方式是$('&lt;img&gt;').attr('src', array[index]).insertAfter(self)。 (为什么正确?出于安全原因,仅此而已。但是self.after('&lt;img src="' + array[index] + '"&gt;) works too)。此外,您可以将self = $(this); 移动到after()/insertAfter() 调用内部。
    • interval 在您的示例中如何被迭代?
    • @Ryan nth-of-type 进行迭代,并且 index 变量跟踪您到目前为止访问了多少。
    【解决方案4】:

    获取答案并使用迭代器遍历其中的每三分之一:

    var answers = interview.find('p.answer:nth-of-type('+i+')');
    for (var answerIndex = 2; (answerIndex < answers.length) && (((answerIndex + 1) / 3) < array.length); answerIndex += 3) {
        $(answers[answerIndex]).after('<img src="array['+((answerIndex + 1) / 3)+']">');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2022-09-19
      相关资源
      最近更新 更多