Как уменьшить повторяющийся код 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);
EDIT: используя код Джонатана ниже, я все еще задаюсь вопросом, Можно ли было бы сделать эквивалент:
(E1,A1,x,x,x).addEventListener('ended', callback, false);
// I know this bit of code doesn't work
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);
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); }
Что-то вроде
var addEndedEvent = function(elem) { elem.addEventListener('ended', function() { this.currentTime = 0; this.play(); }, false); } addEndedEvent(new Audio('audio/A1.ogg'));
Вы должны быть в состоянии сделать что-то подобное. Если у вас есть еще файлы, просто добавьте их имя в массив
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) }
Для отредактированного вопроса, если вы используете функцию
each
из подчеркивания.js Вы можете сделать следующее:_.each([E1,A1,B1], function(audio) { audio.addEventListener('ended', callback, false); });