Skip to content

Commit b387833

Browse files
committed
events module
1 parent c9e7f8a commit b387833

2 files changed

Lines changed: 55 additions & 16 deletions

File tree

src/js/events.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Events {
2+
constructor () {
3+
this.events = {};
4+
5+
this.audioEvents = [
6+
'abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'ended', 'error',
7+
'loadeddata', 'loadedmetadata', 'loadstart', 'mozaudioavailable', 'pause', 'play',
8+
'playing', 'progress', 'ratechange', 'seeked', 'seeking', 'stalled', 'suspend',
9+
'timeupdate', 'volumechange', 'waiting'
10+
];
11+
this.playerEvents = [];
12+
}
13+
14+
on (name, callback) {
15+
if (this.type(name) && typeof callback === 'function') {
16+
if (!this.events[name]) {
17+
this.events[name] = [];
18+
}
19+
this.events[name].push(callback);
20+
}
21+
}
22+
23+
trigger (name, info) {
24+
if (this.events[name] && this.events[name].length) {
25+
for (let i = 0; i < this.events[name].length; i++) {
26+
this.events[name][i](info);
27+
}
28+
}
29+
}
30+
31+
type (name) {
32+
if (this.playerEvents.indexOf(name) !== -1) {
33+
return 'player';
34+
}
35+
else if (this.audioEvents.indexOf(name) !== -1) {
36+
return 'audio';
37+
}
38+
39+
console.error(`Unknown event name: ${name}`);
40+
return null;
41+
}
42+
}
43+
44+
export default Events;

src/js/player.js

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import User from './user';
99
import Lrc from './lrc';
1010
import Controller from './controller';
1111
import Timer from './timer';
12+
import Events from './events';
1213

1314
const instances = [];
1415

@@ -27,17 +28,7 @@ class APlayer {
2728
this.audios = [];
2829
this.mode = this.options.mode;
2930

30-
// define APlayer events
31-
const eventTypes = ['play', 'pause', 'canplay', 'playing', 'ended', 'error'];
32-
this.event = {};
33-
for (let i = 0; i < eventTypes.length; i++) {
34-
this.event[eventTypes[i]] = [];
35-
}
36-
this.trigger = (type) => {
37-
for (let i = 0; i < this.event[type].length; i++) {
38-
this.event[type][i]();
39-
}
40-
};
31+
this.events = new Events();
4132

4233
// multiple music
4334
this.playIndex = 0;
@@ -145,6 +136,12 @@ class APlayer {
145136
}
146137
});
147138

139+
for (let i = 0; i < this.events.audioEvents.length; i++) {
140+
this.audio.addEventListener(this.events.audioEvents[i], () => {
141+
this.events.trigger(this.events.audioEvents[i]);
142+
});
143+
}
144+
148145
// show audio time: the metadata has loaded or changed
149146
this.audio.addEventListener('durationchange', () => {
150147
if (this.audio.duration !== 1) { // compatibility: Android browsers will output 1 at first
@@ -344,12 +341,10 @@ class APlayer {
344341
}
345342

346343
/**
347-
* attach event
344+
* bind events
348345
*/
349-
on (name, func) {
350-
if (typeof func === 'function') {
351-
this.event[name].push(func);
352-
}
346+
on (name, callback) {
347+
this.events.on(name, callback);
353348
}
354349

355350
/**

0 commit comments

Comments
 (0)