HTML5 audio 双向绑定问题

我有一个audio标签,还有一个反应播放时间的可以拉动的进度条

根据 audio 的 timeupdate 事件来更新进度条

this.nativeAudio.addEventListener('timeupdate', () => {
  this.currentTime = this.nativeAudio.currentTime
}

拖动进度条来调整 audio 的 currentTime

this.progressBar.addEventListener('change', () => {
  this.nativeAudio.currentTime = this.progressBar.value
})

但是问题是,进度条的更改会被在它之前的 audio 触发的事件覆盖掉。这个双向绑定该怎么实现。

阅读 3.7k
1 个回答

在拖动进度条的时候,让timeupdate的事件回调先跳过。

this.nativeAudio.addEventListener('timeupdate', () => {
  if (this.isUserDraggingProgressBar) return; // 有傻逼在拖进度条,直接return
  this.currentTime = this.nativeAudio.currentTime
}


this.progressBar.addEventListener('change', () => {
  this.setProgressBarDragging();
  this.nativeAudio.currentTime = this.progressBar.value
});

this.setProgressBarDragging = function(){
  clearTimeout(this._progressBarDraggingTimer); 
  this._progressBarDraggingTimer = setTimeout(() => {
    // debounce的效果,频繁触发setProgressBarDragging,
    // 会抑制它变成false, 直到不再触发
    this.isUserDraggingProgressBar = false;
  }, 500);
  this.isUserDraggingProgressBar = true;
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题