【问题标题】:How to iteratively add and remove images to an HTML element?如何迭代地向 HTML 元素添加和删除图像?
【发布时间】:2019-03-26 02:46:19
【问题描述】:

我正在创建一个带有不断变化的背景图像的简单网页,但不确定如何达到预期的效果。

在我的标签中,我创建了一组图像(更准确地说是文件路径)。我已经通过 id 检索了 DOM 元素。我已经编写了一个 for 循环,它应该遍历上述数组。循环应该:

  • 1 - 创建一个新的“img”元素
  • 2 - 将其 src 设置为当前数组项(同样是文件路径)
  • 3 - 将这个新创建的图像附加到检索到的 DOM 元素中
  • 4 - 然后,在本次迭代完成时,应删除“img”元素

以下是嵌入在 HTML 文档中的 JS 代码...

<script type="text/javascript">
  $(document).ready(function () {

        var image_array= [
        "static/arch.jpg",
        "static/pasture.jpg",
        "static/starry_night.jpg",
        "static/arturo.jpg",
        "static/desert.jpg",
        "static/jedi.jpg",
        "static/kylo.jpg",
        "static/trooper.jpg"
        ]

    var background = document.getElementById('cur_background');

        for (var i = 0, j = image_array.length; i < j; i++) {
            var img = document.createElement('img');
            img.src = image_array[i]; 
            background.appendChild(img);
                setTimeout(function() {
                    $('img').remove();
                }, 5000);
        }

    });

将出现图像的 HTML 元素写在下面...

    <div class="middle">
        <ul class="middle_background">
            <li id= "cur_background"></li>
            <!-- <li id="1"><img src="static/arch.jpg"></li>
            <li id="2"><img src="static/pasture.jpg"></li>
            <li id="3"><img src="static/starry_night.jpg"></li>
            <li id="4"><img src="static/arturo.jpg"></li>
            <li id="5"><img src="static/desert.jpg"></li>
            <li id="6"><img src="static/jedi.jpg"></li>
            <li id="7"><img src="static/kylo.jpg"></li>
            <li id="8"><img src="static/trooper.jpg"></li> -->
        </ul>
        <h2>And so the story begins...</h2>
    </div>

我预计会发生什么:

循环遍历图像数组,创建一个临时的“img”元素,它会出现在其中,然后在到达特定循环迭代结束时删除“img”元素。

实际发生的情况:

所有图像一次加载,以列表格式显示在正确的 DOM 元素('cur-background')中,然后在 setTimeout 间隔激活时集体消失。

【问题讨论】:

  • $('img').remove();正在选择所有图像....不是当前图像。如果你想把它们全部删除,那么你要这样做 9 次。
  • 像你这样的小循环只需要几毫秒(如果那样的话)就可以完成。因此,在 非常 很短的时间内,您创建了一个图像,将其附加到文档并进行设置,以便在 5 秒后将其删除。由于循环运行得如此之快,5 秒计数器不会连续运行,它本质上是同时运行的。但是,实际上仍然不清楚您要做什么。
  • 请添加相应的 HTML 以便我们复制您的问题。
  • “由于循环运行得如此之快,5 秒计数器不会连续运行,它实际上是同时运行的......” 我假设 setTimeout 将应用于循环的每个元素。 ..但是由于计算机处理其他命令的速度有多快,所以 setTimeout 会延迟很长时间?正确的? -------- 并澄清我的目标是:我希望我的网页每五秒左右显示一个新的背景图像。
  • $('img') 不适用于“每个元素”。如前所述,它是一个选择器,选择所有图像。仅仅因为你有一个名为img 的变量并不意味着该字符串会做不同的事情。

标签: javascript jquery html


【解决方案1】:
var $background = $('#cur_background');

function loopBackgroundImages ( nextIndex ) {
  // create an image tag
  var $img = $('<img>').attr('src', image_array[nextIndex]);

  // append it to the background
  $background.append($img);

  setTimeout(function(){
    // after 5 seconds, remove the image and iterate to the next loop
    // you can use modulus (%) to cause the index to wrap back to 0
    $img.remove();
    loopBackgroundImages( ++nextIndex % image_array.length );
  }, 5000);
}

// start the loop at index 0
loopBackgroundImages(0);

【讨论】:

  • 它有效!此外,巧妙地添加了使用模数循环循环的方法,以便图像继续循环并且不会在一次完整迭代后停止。我确信有一种更有效的方法可以实现这一点(也许使用可以链接到 JS 的 CSS 显示/隐藏属性),但是完成与完美是一个很好的开始。这是我在 StackOverflow 上的第一个问题!感谢您对所有人的快速和响应式反馈。非常感谢 Taplar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多