【发布时间】:2019-12-18 18:53:03
【问题描述】:
我正在使用Howler.js 创建一个播客播放器。
我有 4 个按钮和一个输入都可以控制播客。
当您点击播放、后退和前进按钮时,在执行它们的操作后,它们会调用一个名为 step 的函数,该函数负责更新范围输入的值。
function step(){
var self = this;
var seek = sound.seek() || 0;
rangeInput.attr('value', seek);
//If sound is still playing, continue stepping
if(sound.playing()){
requestAnimationFrame(step.bind(self));
}
}
当您尝试使用输入来更改您在播客中的位置时,就会出现问题。虽然它确实将音频向前移动,但 step 函数会停止更新范围输入的值。
奇怪的是,如果您在使用范围输入后检查元素,您确实可以看到它的值正在 DOM 中更新。但点永远不会再移动。
我创建了一个小提琴,我在其中重新创建了这个问题。 Link to Fiddle
这是我的全部代码
var sound = new Howl({
src: ['https://s3.amazonaws.com/ShopTalk/080_rapidfire_19.mp3'],
onplay:function(){
requestAnimationFrame(step.bind(this));
}
});
var rangeInput = $('#range');
sound.once('load', function(){
$('#loading').hide();
$('#ready').show();
$('#controls').show();
$('#range').attr('max', sound.duration());
console.log('Podcast Loaded');
});
$('#play').on('click', playPodcast);
$('#pause').on('click', pausePodcast);
$('#skip-back').on('click', skipBackward);
$('#skip-forward').on('click', skipForward);
rangeInput.change(seek);
function step(){
var self = this;
var seek = sound.seek() || 0;
rangeInput.attr('value', seek);
//If sound is still playing, continue stepping
if(sound.playing()){
requestAnimationFrame(step.bind(self));
}
}
function seek(){
var seekedTime = $('#range').val();
sound.seek([seekedTime]);
step();
}
function playPodcast(){
sound.play();
}
function pausePodcast(){
sound.pause();
}
function skipForward(){
sound.seek([sound.seek() + 5]);
step();
}
function skipBackward(){
sound.seek([sound.seek() - 5]);
step();
}
总结一下,
我正在使用一个名为step() 的函数,只要仍在播放音频文件,它就会不断更新范围输入的值。当您使用范围输入在播客中手动选择一个位置时,它会停止更新该值,即使它正在 DOM 中进行更新,并且播客会准确地寻找其新位置并继续播放。
【问题讨论】:
-
下面的回答解决了你的问题吗?
标签: javascript howler.js