无论如何,我可以减少下面的重复吗?我只展示了两个代码块,但是会有更多相同的代码块。
我尝试过使用数组和循环,但不幸的是我无法得到一个有效的例子。提前谢谢。
E1 = new Audio('audio/E1.ogg');
E1.addEventListener('ended', function() {
this.currentTime = 0;
this.play();
}, false);
A1 = new Audio('audio/A1.ogg');
A1.addEventListener('ended', function() {
this.currentTime = 0;
this.play();
}, false);
编辑:使用下面的Jonathan代码,我仍然想知道是否可以做相同的代码:
(E1,A1,x,x,x).addEventListener('ended', callback, false);
// I know this bit of code doesn't work
答案 0 :(得分:6)
由于您的回调是相同的,您可以将它们绑定到变量:
var E1 = new Audio('audio/E1.ogg');
var A1 = new Audio('audio/A1.ogg');
var callback = function() {
this.currentTime = 0;
this.play();
};
E1.addEventListener('ended', callback, false);
A1.addEventListener('ended', callback, false);
答案 1 :(得分:2)
类似
var addEndedEvent = function(elem) {
elem.addEventListener('ended', function() {
this.currentTime = 0;
this.play();
}, false);
}
addEndedEvent(new Audio('audio/A1.ogg'));
答案 2 :(得分:2)
var files = ['audio/E1.ogg', 'audio/A1.ogg'];
//note that we cannot/should not use for(... in ...) - that won't do what you expect
for(var i = 0; i < files.length; ++i) {
var audio = new Audio(files[i]);
audio.addEventListener('ended', function() {
this.currentTime = 0;
this.play();
}, false);
}
答案 3 :(得分:0)
你应该可以做这样的事情。如果您有更多文件,只需将其名称添加到数组fileNames
。
var audioRefs = { }, fileNames = ['E1','A1','B1'], i, file;
for( i = 0; i < fileNames.length; i++ ) {
file = fileNames[i];
audioRefs[file] = new Audio('audio/' + file + '.ogg');
audioRefs[file].addEventListener('ended', callback, false);
}
function callback() {
this.currentTime = 0;
this.play();
};
audioRefs
最终看起来像......
audioRefs = {
'A1': (reference to A1 Audio object),
'B1': (reference to B1 Audio Object)
}
答案 4 :(得分:0)
对于已修改的问题,如果您使用Underscore.js中的each
功能,则可以执行以下操作:
_.each([E1,A1,B1], function(audio) {
audio.addEventListener('ended', callback, false);
});