2011-06-26 156 views
2

有没有反正我可以减少下面的重复?我只显示了两个代码块,但现在和将来会有更多相同的代码块。如何减少重复的javascript代码

我试过使用数组和循环,但不幸的是我无法得到一个工作的例子。先谢谢你。

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); 

编辑:使用下面乔纳森的代码,我仍然不知道它是否有可能做等价的:由于你的回调是你可以将它们绑定到同一

(E1,A1,x,x,x).addEventListener('ended', callback, false); 
// I know this bit of code doesn't work 
+0

你应该留下你在问题中的原始代码。事实上,接受的答案令人困惑,因为它看起来像你已经在问题中已经有了。 – Davy8

+0

@ davy8:我不确定为什么我从来没有看过这个评论,但它绝对有道理。我已经回过头来重新编辑这个问题,以便将来的答案搜索者能够很容易地看到解决方案正在解决什么问题。 – tw16

回答

5

一个变量:

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); 
+0

我不敢相信我没有发现创建一个回调变量。我认为我必须从盯着所有其他代码中获得代码盲目性! – tw16

2

var addEndedEvent = function(elem) { 
    elem.addEventListener('ended', function() { 
     this.currentTime = 0; 
     this.play(); 
    }, false); 
} 

addEndedEvent(new Audio('audio/A1.ogg')); 
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); 
} 
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) 
} 
0

所编辑的问题,如果你从Underscore.js使用each功能,您可以执行以下操作:

_.each([E1,A1,B1], function(audio) { 
    audio.addEventListener('ended', callback, false); 
});