JavaScript:在 2 个图像之间切换无效,使用 setInterval

JavaScript: Toggling Between 2 Images Not Working, Using setInterval

JS 新手。我试图在页面加载开始时每 1 秒显示两张图片 dragon.svgdragon1.svg 以及无限期显示 运行 之间切换。但是,我的图像只改变一次,然后每秒保持 运行 但不遵循我的 if/else 语句的规则。

我怀疑该函数在每次运行时都没有更改名为 dragonDiv 的全局变量的值,因此每次运行时,它都使用 dragonDiv 的原始值变量。

在HTML上,我有一个div,里面有图片,像这样:

<body onload="changeDragon();">
    <div id="dragonarea">
      <img src="images/dragon.svg"/>
    </div>
</body>

然后我有这个 JS,它应该将图像更改为 dragon1.svg 如果当前是 dragon.svg,反之亦然,每 1 秒一次。

function changeDragon() {
  changeInterval = setInterval(dragonColorChange, 1000);
}

let dragonDiv = document.getElementById('dragonarea');
console.log(dragonDiv.innerHTML); // Correctly logs <img src="images/dragon.svg"/>

function dragonColorChange() {
  if (dragonDiv.innerHTML = '<img src="images/dragon.svg">') {
    dragonDiv.innerHTML = '<img src="images/dragon1.svg">';
    console.log(dragonDiv.innerHTML) // Correctly logs <img src="images/dragon1.svg"/>
  } else {
    dragonDiv.innerHTML = '<img src="images/dragon.svg">';
    console.log(dragonDiv.innerHTML) // Never makes it to this point
  }
}

如上所述,控制台日志告诉我它第一次正确地更改了图像,但在那之后,它似乎再次采用 dragonDiv 的原始值(dragon.svg image) 和 运行 那个 innerHTML 上的函数再次(因此再次将其更改为 dragon1.svg),而不是在 [=46= 之后更新 innerHTML ] 函数一次,正如我告诉它的那样,并强制它执行 else 语句。

我尝试将 dragonDiv 变量放在 dragonColorChange 函数内部以及外部作为全局变量。我尝试使用 document.getElementById('dragonarea').src 而不是替换 div 标签的整个内部 HTML。我尝试使用 === 而不是 =。我尝试了大约 4 个小时的各种其他事情,但我无法弄清楚如何让它继续循环 if/else 语句。

我的代码有什么错误吗?

if 条件中有错字。赋值运算符不是与 ===== 进行比较,而是进行赋值而不是比较。尝试将其更改为比较。

我猜错字了,使用===或==进行比较。 此外,body 上的 onload 函数有不同的引号 [”](当我在 jsfiddle 上复制并粘贴时,它不起作用)而不是 ["]

function changeDragon() {
  changeInterval = setInterval(dragonColorChange, 1000);
}

let dragonDiv = document.getElementById('dragonarea');
/* console.log(dragonDiv.innerHTML); // Correctly logs <img src="images/dragon.svg"/> */

function dragonColorChange() {
  if (dragonDiv.innerHTML === '<img src="images/dragon.svg">') {
    dragonDiv.innerHTML = '<img src="images/dragon1.svg">';
    console.log(dragonDiv.innerHTML) // Correctly logs <img src="images/dragon1.svg"/>
  } else {
    dragonDiv.innerHTML = '<img src="images/dragon.svg">';
    console.log(dragonDiv.innerHTML) // Never makes it to this point
  }
}
<body onload="changeDragon();">
  <div id="dragonarea">
    <img src="images/dragon.svg" />
  </div>
</body>

这里我直接比较和更改 image.src,而不是像其他人已经建议的那样 div 的内部 HTML。

HTML:

<body onload="changeDragon();">
    <div id="dragonarea">
      <img id="dragon-image" src="images/dragon.svg"/>
    </div>
</body>

JavaScript:

function changeDragon() {
  changeInterval = setInterval(dragonColorChange, 1000);
}

let dragonImage = document.getElementById('dragon-image');

function dragonColorChange() {
  if (dragonImage.src === 'images/dragon.svg') {
    dragonImage.src = 'images/dragon1.svg';
  } else {
    dragonImage.src = 'images/dragon.svg';
  }
}

除了打字错误(= 是赋值,== 或 == 是比较),您还可以做出一些改进

  1. 使用 addEventListener
  2. 更改src,而不是innerHTML,浪费DOM渲染
  3. 我建议一个数据属性
let changeInterval;
let dragonImage;
window.addEventListener("load", function() {
  dragonImage = document.getElementById("dragonImage");
  changeInterval = setInterval(dragonColorChange, 1000);
})

function dragonColorChange() {
  const toggle = dragonImage.dataset.toggle
  const src = toggle === "0" ? "images/dragon1.svg" : "images/dragon.svg";
  dragonImage.src = src;
  dragonImage.dataset.toggle = toggle === "0" ? "1" : "0";
}
<div id="dragonarea">
  <img id="dragonImage" data-toggle="0" src="images/dragon.svg" />
</div>

正如其他人所说,您需要 ===。

这是一种方法,可以将变量限制在函数范围内。我正在使用 .getAttribute("src") 而不是 .src 因为它获得了相对 url 路径。

请注意,dragonColorChange 并未传递到 setInterval 中。就是调用dragonColorChange返回的函数。

  const changeDragon = function () {
    changeInterval = setInterval(dragonColorChange(), 1000);
  };

  function dragonColorChange() {
    let dragonImg = document.querySelector('#dragonarea img');
    return function () {
      dragonImg.src = dragonImg.getAttribute("src") === "images/dragon.svg" ? "images/dragon1.svg" : "images/dragon.svg";
    }
  }