Я не знаю, о какой ошибке Chrome вы говорите, но для более чистого кода вас может заинтересовать #t=start[,end]
Media Fragment , который позволит вам установить временной диапазон непосредственно какисточник вашего :
onclick =e=> {
const data = e.target.dataset;
if(!data.start) return;
vid.src = vid.src.split('#')[0] +
'#t=' + data.start + ',' + data.end;
// url.vid#t=start,end
vid.play();
}
<button data-start="5" data-end="10">play [5,10]</button>
<button data-start="35" data-end="40">play [35,40]</button>
<button data-start="00:01:25" data-end="00:01:30">play [00:01:25,00:01:30]</button>
<video id="vid" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" muted></video>
Теперь, если вы действительно хотите идти по своему пути, тогда вам придется немного изменить свой код.
Никогда не добавляйте новый прослушиватель событий из сгенерированного пользователем события.
Добавляйте его один раз и запускайте только семафоры / обновляйте переменные из пользовательских событий.
Поэтому мы сначала добавляем timeupdate событие в нашем , тогда, если никакого события, сгенерированного пользователем, не произошло, мы завершаем работу рано.В противном случае мы проверяем переменную, которая доступна обоим слушателям наших событий (здесь она называется next_stop
), если мы должны сделать паузу или нет.
Затем в обработчиках событий кнопок мы обновляем currentTime
, запрашиваем его воспроизведение и обновляем next_stop
.
ДваСлушатели событий могут взаимодействовать благодаря общей переменной next_stop
, но больше нет конфликтов.
let next_stop = Infinity; // a variable shared by both event listeners
// add the event listeners only once
vid.addEventListener('timeupdate', handleTimeupdate, {passive: true});
document.addEventListener('click', handleClick);
function handleTimeupdate(evt) {
// not set? exit early
if(!isFinite(next_stop)) return;
// a single action
if(this.currentTime > next_stop) {
this.pause();
// if you want to disable the range once it's done
// e.g to allow default controls interactions
// next_stop = Infinity;
}
}
function handleClick(evt) {
const times = parseTime(evt.target);
if(!times) return;
// update the video's current time
vid.currentTime = times.start;
// update the shared variable
next_stop = times.end;
// start playing if needed
if(vid.paused) {
vid.play();
}
}
function parseTime(target) {
const data = target.dataset;
if(!data || !data.start) return null;
return {start: +data.start, end: +data.end};
}
<button data-start="5" data-end="10">play [5,10]</button>
<button data-start="35" data-end="40">play [35,40]</button>
<button data-start="85" data-end="90">play [00:01:25,00:01:30]</button>
<video id="vid" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/2/22/Volcano_Lava_Sample.webm/Volcano_Lava_Sample.webm.360p.webm" controls></video>