Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Не перезаписывать переменную до удаления (https://javascript.ru/forum/dom-window/83346-ne-perezapisyvat-peremennuyu-do-udaleniya.html)

ethereal 19.11.2021 20:06

Не перезаписывать переменную до удаления
 
Сразу извиняюсь за глупый вопрос, но хочется разобраться в этом

Есть примерно такой код:

video.addEventListener('timeupdate', (event) => {
  const time = video.currentTime;
  console.log(time);
});


Переменная "time", постоянно перезаписывается.

Интересует следующее, можно сделать что б в переменную записывалось только самое первое значение и не менялось, до того как будет удалена через 'delete time;', и затем cнова также записывалось первое значение и т.д?

Спасибо!

voraa 19.11.2021 20:17

Потому, что по мере проигрывания клипа постоянно меняется текущий таймкод и постоянно возникает событие timeupdate

Про переменную и особенно про ее удаление - не понял.

Aetae 19.11.2021 20:39

let time;
video.addEventListener('timeupdate', (event) => { 
  time ??= video.currentTime;
  console.log(time);
});

voraa 19.11.2021 20:51

Aetae,
А смысла?
Не проще
let time;
video.addEventListener('timeupdate', (event) => {
  time = video.currentTime;
  console.log(time);
}, {once:true});

И что там про удаление?

Aetae 19.11.2021 20:59

voraa,
let time;
time ??= 1;
time ??= 2;
time ??= 3;
time // 1

А удаление, надо полагать, по какому-то другому событию он сделает:
time = null;
(delete, конечно, не сработает) и оно снова перезапишется на currentTime. :)

Хотя зачем - это да, не понятно. Можно вообще просто рукам брать currentTime и ничего не удалять.

voraa 19.11.2021 21:15

Ну может ты и прав, если там еще какие действия надо делать
Например

let time;
video.addEventListener('timeupdate', (event) => {
  time ??= video.currentTime;
  if ( video.currentTime - time >= 5000) {
     ....
  }
});

ethereal 19.11.2021 21:30

Все что мне нужно это выполнить события в определенное время видео, через несколько секунд, к примеру 7

Допустим видео начинается с 20-ой секунды, затем:

27 event
34 event
41 event

и т.д

Важно что б события сработали когда именно на видео будет определенная секунда, просто через Interval не подходит

ethereal 19.11.2021 21:39

Я думал если записать первое значение, потом можно сравнить, к примеру:

const time = video.currentTime;
if ( ideo.currentTime > (time + 7)) {
event
delete time;
}


И все по новой, но что то не так тут

ethereal 19.11.2021 21:48

Другими словами мне нужно сделать превью видео при наведение на блок

Что то такое, видео начинается на 20-ой секунде, идет 3 сек, перематывается на 7, идет 3 сек, перематывается на 7 и т.д

Aetae 19.11.2021 22:48

Жестоко. Ради превью ты юзеру всё видео целиком так скачаешь.)

ethereal 19.11.2021 22:56

нет, у меня уже сделано возможность как на youtube, показывать только кусок видео. Хочу сделать и второй вариант, на выбор так сказать

voraa 19.11.2021 23:49

Сложновато оказалось (давно с видео не работал)
Получилось как то так
(Пример видео - какой нашел в инете не самый короткий

<body>
<video id='video' src='https://www.nlm.nih.gov/web/documentation/TemplateDocumentation/video_files/IN_Intro-800.mp4'>
</video>
<br>
<button id=bs>Start</button>
<script>
let duration;
const start = 20;
const dplay = 3;
const dskip = 7;
const video = document.getElementById('video')

const play = (d) => {
	console.log('play', video.currentTime)
	const te = Math.min(video.currentTime + d, duration)
	const result = !(te === duration)
	return new Promise ((res) => {
		const handl = () => {
			if (video.currentTime > te-0.05) {
				video.removeEventListener('timeupdate', handl)
				res (result);
			}
		}
		video.addEventListener('timeupdate', handl)
		video.play();
	})	
}

const skip = (d) => {
	console.log('skip', video.currentTime)
	const ts = Math.min(video.currentTime + d, duration)
	return new Promise ((res) => {
		if (ts === duration) res (false);
		const handl = () => {
			video.removeEventListener('seeked', handl)
			res (true);
		}
		video.addEventListener('seeked', handl)
		video.currentTime = ts;
	})			
}

const work = async () => {
	let result = true;
	result = await skip (start)
	while (result) {
		result = await play(dplay)
		if (result) result = await skip(dskip)
	}
}

video.addEventListener('durationchange', () => {
	duration = video.duration;
})
document.getElementById('bs').onclick = () => work()
</script>
</body>

ethereal 20.11.2021 17:31

благодарю


Часовой пояс GMT +3, время: 05:34.