代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

JavaScript应用程序错误:计数器变量跳过一个值

  •  1
  • Razvan Zamfir  · 技术社区  · 4 年前

    我正在开发一个纯JavaScript的无限卷轴。我有4个帖子列表。

    当我到达容器的底部时,我试图加载更多的帖子(原始帖子的克隆)。

    class InfiniteScroll {
      constructor() {
        this.observer = null;
        this.isLoading = false;
        this.postsContainer = document.querySelector('#postsContainer');
        this.postsArary = postsContainer.querySelectorAll('.post');
        this.iterationCount = Number(this.postsContainer.dataset.currentPage);
        this.perPage = 5;
        this.maxCount = this.postsContainer?.dataset?.maxCount;
        this.numberOfPages = Math.ceil(this.maxCount / this.perPage);
        this.hasNextPage = this.iterationCount < this.numberOfPages;
      }
    
      loadMorePosts() {
        if (this.hasNextPage) {
          this.postsArary.forEach(item => {
            let postClone = item.cloneNode(true);
            this.postsContainer.appendChild(postClone);
          });
        } else {
          if (this.observer) this.observer.disconnect();
        }
      }
    
      getLastPost() {
        const allPosts = [...this.postsArary];
        return allPosts[allPosts.length - 1];
      }
    
      counter() {
         console.log(this.iterationCount);
        if (this.hasNextPage) {
          this.iterationCount++;
          this.postsContainer.dataset.currentPage = this.iterationCount;
        }
    
        this.postsContainer.dataset.hasNextPage = this.hasNextPage;
        this.hasNextPage = this.iterationCount < this.numberOfPages;
      }
    
      bindLoadMoreObserver() {
        if (this.postsContainer) {
          this.observer = new IntersectionObserver((entries, observer) => {
            entries.forEach(entry => {
              if (entry && entry.isIntersecting) {
                observer.unobserve(entry.target);
                this.counter();
                this.loadMorePosts();
                observer.observe(this.getLastPost());
              }
            });
          });
    
          this.observer.observe(this.getLastPost());
        }
      }
    
      init() {
        this.bindLoadMoreObserver();
      }
    }
    
    const infiniteScroll = new InfiniteScroll();
    infiniteScroll.init();
    body, body * {
      margin: 0;
      padding: 0;
    }
    
    body {
      font-family: Arial, Helvetica, sans-serif;
    }
    
    .post {
      margin: 20px;
      padding: 15px;
      border: 1px solid #ccc;
      border-radius: 5px;
    }
    
    p {
      line-height: 1.5;
    }
    <div id="postsContainer" data-has-next-page="true" data-current-page="1" data-max-count="11">
      <div class="post">
        <h2>Title 1</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque dolorum consequatur nostrum sapiente ipsa! Veniam, laudantium accusantium, odio maxime quo adipisci possimus enim quam, voluptate quidem animi perferendis delectus aliquam?</p>
      </div>
      <div class="post">
        <h2>Title 2</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque dolorum consequatur nostrum sapiente ipsa! Veniam, laudantium accusantium, odio maxime quo adipisci possimus enim quam, voluptate quidem animi perferendis delectus aliquam?</p>
      </div>
      <div class="post">
        <h2>Title 3</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque dolorum consequatur nostrum sapiente ipsa! Veniam, laudantium accusantium, odio maxime quo adipisci possimus enim quam, voluptate quidem animi perferendis delectus aliquam?</p>
      </div>
      <div class="post">
        <h2>Title 4</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque dolorum consequatur nostrum sapiente ipsa! Veniam, laudantium accusantium, odio maxime quo adipisci possimus enim quam, voluptate quidem animi perferendis delectus aliquam?</p>
      </div>
    </div>

    问题

    这辆车出了问题 iterationCount 变量:似乎没有达到值2。

    我没能找出原因。

    我做错什么了?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Razvan Zamfir    4 年前

    阵列 postsArary 在构造函数中初始化并且从未更新: getLastPost() 总是返回第四个帖子,而不是动态添加的最后一个帖子。因此 IntersectionObserver

    更新的 getLastPost() 方法:

    getLastPost() {
      const allPosts = postsContainer.querySelectorAll('.post');
      return allPosts[allPosts.length - 1];
    }
    

    这并不能完全解决问题。第三页仍然无法加载,因为 counter() 在前面调用 loadMorePosts() hasNextPage false loadMorePosts() 仍然应该加载更多的帖子。

    更新的回调:

    bindLoadMoreObserver() {
        if (this.postsContainer) {
          this.observer = new IntersectionObserver((entries, observer) => {
            entries.forEach(entry => {
              if (entry && entry.isIntersecting) {
                observer.unobserve(entry.target);
                this.loadMorePosts();
                this.counter();
                if (this.hasNextPage) {
                  observer.observe(this.getLastPost());
                }
              }
            });
          });
    
          this.observer.observe(this.getLastPost());
        }
      }