-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
127 lines (105 loc) · 4.44 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//get hold of each element
const player = document.querySelector('.player');
const viewer = player.querySelector('.viewer')
const toggle = player.querySelector('.toggle')
//anything with data-skip
const skipButtons = player.querySelectorAll('[data-skip]');
const mute = player.querySelector('#mute');
const progress = player.querySelector('.progress');
const progressBar = player.querySelector('.progress__filled');
const ranges = player.querySelectorAll('.player__slider');
const fullscreen = player.querySelector('.zoom');
//functions
function togglePlay(){
const status = viewer.paused ? 'play':'pause';
viewer[status]();
}
function toggleButton(){
const icon = this.paused ? '►' : '❚ ❚';
toggle.textContent = icon;
}
function skip() {
viewer.currentTime += parseFloat(this.dataset.skip);
}
function handleVolumeAndPlayback(){
//name will be either 'volume', 'playbackrate'
viewer[this.name] = this.value;
}
function toggleMute(){
viewer.muted =!viewer.muted;
if(mute.classList.contains('unmute')){
mute.classList.remove('unmute')
mute.classList.add('mute')
}
if(mute.classList.contains('mute')){
mute.classList.remove('mute')
mute.classList.add('unmute')
}
}
function handleProgress(){
//change the flex-basis based on the width or the played/duration
const currentWidth = (viewer.currentTime / viewer.duration) * 100 || 0;
progressBar.style.flexBasis = `${currentWidth}%`
}
function scrub(e){
const scrubTime = (e.offsetX / progress.offsetWidth) * viewer.duration;
viewer.currentTime = scrubTime;
}
function handleFullscreen(e){
if (isFullScreen()) {
if (document.exitFullscreen) document.exitFullscreen();
else if (document.mozCancelFullScreen) document.mozCancelFullScreen();
else if (document.webkitCancelFullScreen) document.webkitCancelFullScreen();
else if (document.msExitFullscreen) document.msExitFullscreen();
setFullscreenData(false);
}
else {
if (viewer.requestFullscreen) viewer.requestFullscreen();
else if (viewer.mozRequestFullScreen) viewer.mozRequestFullScreen();
else if (viewer.webkitRequestFullScreen) viewer.webkitRequestFullScreen();
else if (viewer.msRequestFullscreen) viewer.msRequestFullscreen();
setFullscreenData(true);
}
}
const setFullscreenData = function(state) {
viewer.setAttribute('data-fullscreen', !!state);
}
//check if fullscreenApi is supported
const fullScreenEnabled = !!(document.fullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled || document.webkitSupportsFullscreen || document.webkitFullscreenEnabled || document.createElement('video').webkitRequestFullScreen);
if (!fullScreenEnabled) {
fullscreen.style.display = 'none';
}
//check status if fullscreen
const isFullScreen = function() {
return !!(document.fullScreen || document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement);
}
//event listeners
viewer.addEventListener('click', togglePlay);
viewer.addEventListener('play', toggleButton);
viewer.addEventListener('pause', toggleButton);
viewer.addEventListener('timeupdate', handleProgress)
toggle.addEventListener('click', togglePlay)
mute.addEventListener('click',toggleMute)
skipButtons.forEach(button => button.addEventListener('click', skip));
ranges.forEach(range => range.addEventListener('change',handleVolumeAndPlayback));
ranges.forEach(range => range.addEventListener('mousemove',handleVolumeAndPlayback));
progress.addEventListener('click', scrub)
let mousedownFlag = false;
progress.addEventListener('mousedown', ()=> mousedownFlag = true)
progress.addEventListener('mouseup', ()=> mousedownFlag = false)
//listen to mousemove only when user has clicked the left mouse button
progress.addEventListener('mousemove', (e)=> mousedownFlag && scrub(e))
fullscreen.addEventListener('click', handleFullscreen)
// fullscreen events
document.addEventListener('fullscreenchange', function(e) {
setFullscreenData(!!(document.fullScreen || document.fullscreenElement));
});
document.addEventListener('webkitfullscreenchange', function() {
setFullscreenData(!!document.webkitIsFullScreen);
});
document.addEventListener('mozfullscreenchange', function() {
setFullscreenData(!!document.mozFullScreen);
});
document.addEventListener('msfullscreenchange', function() {
setFullscreenData(!!document.msFullscreenElement);
});