微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

元素已从DOM中删除,但是,在使用变量时,条件语句仍然可以看到该元素

如何解决元素已从DOM中删除,但是,在使用变量时,条件语句仍然可以看到该元素

为什么当使用完整的JavaScript选择器时,检查间隔是否存在的“ if语句”可以正常工作,但是当将其作为变量传递时,IF语句认为该元素仍然存在,尽管不存在?

两个例子来说明问题;首先是具有完整JS选择器的工作版本:

 
  var LoadMoreButton = document.querySelector('.loadMore');

  setInterval(function(){ LoadMoreButton.remove(); },10000);

  var timer = null;

  timer = window.setInterval(function(){
    console.log(LoadMoreButton);
    if (document.querySelector('.loadMore') !== null) {
      console.log("Element still exists,load more...");
      LoadMoreProducts();
    } else if(document.querySelector('.loadMore') === null) {
       console.log("Element does not exist.");
       StopLoadingProducts();
    }
  },1000);

  function LoadMoreProducts(){
    console.log("LoadMoreProducts Function ran");
  }

  function StopLoadingProducts(){
    console.log("No more products to load");
    clearInterval(timer);
    console.log("End.");
  }
<button class="loadMore">Load More</button>

和带有变量的无效版本。即使元素已经消失了,控制台也会输出该元素!

  var LoadMoreButton = document.querySelector('.loadMore');

  setInterval(function(){ LoadMoreButton.remove(); },10000);

  var timer = null;

  timer = window.setInterval(function(){
    console.log(LoadMoreButton);
    if (LoadMoreButton !== null) {
      console.log("Element still exists,load more...");
      LoadMoreProducts();
    } else if(LoadMoreButton === null) {
       console.log("Element does not exist.");
       StopLoadingProducts();
    }
  },1000);

  function LoadMoreProducts(){
    console.log("LoadMoreProducts Function ran");
  }

  function StopLoadingProducts(){
    console.log("No more products to load");
    clearInterval(timer);
    console.log("End.");
  }
<button class="loadMore">Load More</button>

为什么使用变量时我的if语句不起作用?

解决方法

之所以会这样,是因为document.querySelector返回了一个HtmlElement对象,该对象表示dom中的第一个匹配元素。该对象实际上不是dom元素本身。

在调用Element.remove()时,您将从节点所属的树中删除该节点,但是元素本身仍保留在分配给变量LoadMoreButton的内存中。如果您希望将变量LoadMoreButton从dom中删除后为空,则可以为其分配空值。

var LoadMoreButton = document.querySelector('.loadMore');

setInterval(function () {
  LoadMoreButton.remove();
  LoadMoreButton = null;
},10000);

var timer = null;

timer = window.setInterval(function () {
  if (LoadMoreButton !== null) {
    LoadMoreProducts();
  } else if (LoadMoreButton === null) {
    StopLoadingProducts();
  }
},1000);

function LoadMoreProducts() {}

function StopLoadingProducts() {
  clearInterval(timer);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。