Как уменьшить повторяющийся код 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 2

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