javascript - 自动播放无法在我的 Javascript Slider 上运行

标签 javascript

我的目标是用 Javascript 编写一个 slider ,其中包含一个类。但我遇到了两个问题:

  • 自动播放不起作用
  • 如果我单击“暂停”按钮,然后再次单击“播放”按钮,自动播放也不起作用

HTML 页面位于此处: http://p4547.phpnet.org/bikes/slider.html

这是我的 JavaScript 代码:

class Diaporama {
  constructor() {
    this.controls = document.querySelectorAll('.controls');
    this.slides = document.querySelectorAll('#diaporama .slide');
    this.currentSlide = 0;
    this.n = null;
    this.playing = true;
    this.pauseButton = document.getElementById('pause');
    this.next = document.getElementById('next');
    this.previous = document.getElementById('previous');
  }

// Afficher les boutons previous, play, pause, next :
  controlling() {
    for(let i=0; i < this.controls.length; i++){
        this.controls[i].style.display = 'inline-block';
    }
  }

// Slider Automatique :
  goToSlide(n) {
    this.slides[this.currentSlide].className = 'slide';
    this.currentSlide = (n + this.slides.length)%this.slides.length;
    this.slides[this.currentSlide].className = 'slide showing';
    console.log(this.currentSlide);
  }

  nextSlide() {
    this.goToSlide(this.currentSlide + 1);
  }

  previousSlide() {
    this.goToSlide(this.currentSlide - 1);
  }

  slideInterval() {
    setInterval(this.nextSlide,5000);
  }

  pauseSlideshow() {
    this.pauseButton.innerHTML = '<i class="fas fa-play"></i>';
    this.playing = false;
    clearInterval(this.slideInterval);
  }

  playSlideshow() {
    this.pauseButton.innerHTML = '<i class="fas fa-pause"></i>';
    this.playing = true;
    this.slideInterval = setInterval(this.nextSlide,5000);
  }

  nextItem() {
  next.onclick = () => {
    this.pauseSlideshow();
    this.nextSlide();
  }
  }

  previousItem() {
    previous.onclick = () => {
      this.pauseSlideshow();
      this.previousSlide();
    }
  }

// Changement de slide par les touches du clavier :
  clickKeyboard() {
    document.addEventListener("keydown", ({keyCode}) => {
      if(keyCode === 37){
          this.nextSlide();
      }
      else if(keyCode === 39){
          this.previousSlide();
      }
  })
}

};

let slider = new Diaporama();
slider.controlling();
slider.goToSlide(0);
slider.nextSlide();
slider.previousSlide();
slider.pauseSlideshow();
slider.playSlideshow();
slider.nextItem();
slider.previousItem();
slider.clickKeyboard();

最佳答案

此问题位于 playslideShow 内。当它在 setInterval 内调用 this.nextSlide 时,this 的范围发生了变化。 this 指的是窗口。

在这种情况下,您可以使用bind(),以确保它引用 slider 对象:

playSlideshow() {
    this.pauseButton.innerHTML = '<i class="fas fa-pause"></i>';
    this.playing = true;
    this.slideInterval = setInterval(this.nextSlide.bind(this),5000);
}

关于javascript - 自动播放无法在我的 Javascript Slider 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56533912/

相关文章:

javascript - 如何在Jquery或Phonegap跨平台中获取IP地址

javascript - 结合进度条将文本颜色更改为特定宽度?

javascript - RegExp 搜索特殊字符 "["

javascript - onDrop (javascript) 更改 css

javascript - Html 和 CSS,给自己一个更大的工作空间,同时限制文本的位置

javascript - 在 HTML Canvas 元素上绘制文本的最佳方法是什么?

javascript - WebKit 线程冲突 - 从 UI 自动化中的辅助线程初始使用 WebKit

javascript - 如何使用 Javascript 知道页面访问者的 IP 地址而不使用任何外部站点/响应程序

javascript - 如何将 &lt;script&gt; 添加到 XSLT [通过转义解决]

javascript - css中类的第二个实例的快捷方式