Воспроизведение аудио файлов из массива объектов в js / jquery

0

Я работаю над созданием объекта для обертывания элементов управления элементами экземпляров html5. Для тестирования я сделал такой объект (упрощен для удобочитаемости).

function AudioObject(audio) {
    var innerAudio = audio;

    this.Play = function () {
        innerAudio.play()
    }
}

И у меня есть массив, содержащий экземпляры этого AudioObject.

var AudioObjects = [];

Затем, создавая новые AudioObjects, я добавляю их в массив. У меня есть функция, которая воспроизводит AudioObjects с задержками, поэтому они воспроизводятся последовательно. Что-то вроде этого:

var audioObj = new AudioObject(audio);
AudioObjects.push(audioObj);
....
....
var delay = 0;
$.each(AudioObjects, function(iterator, obj) {
    setTimeout(obj.Play, delay);
    delay = delay + 3000;
}

Когда есть только один аудиофайл, он воспроизводится правильно, но как только я добавляю больше AudioObjects, каждый в массиве имеет свою переменную innerAudio, установленную на последний созданный элемент Audio. Я могу играть каждый из них отдельно от html. Я отлаживал создание, и я вижу, что он настраивает правильный звук, но после того, как его перетащили в массив, объекты в массиве все переключились на последнюю версию innerAudio.

Я не создаю объекты, которые правильно? Я сделал это jsfiddle, чтобы поэкспериментировать с предупреждающим текстом, и у него, похоже, нет проблем, которые я испытываю.

Обновление: я думаю, что нашел свою проблему. Вот как я думал, что вы пишете "публичную" и "частную" функцию внутри объекта.

function Thing(test) {
    var thingTest = test;

    // Public function
    this.PublicTest = function () {
        setTimeout(Test, 1000);
    }

    // Private function
    PrivateTest = function () {
       alert(thingTest);
    }
}

По сути, мой код был структурирован, но "частная" функция имеет разную область действия, чем общедоступная. Я дважды проверил свой массив и фактически сохранил правильный аудиообъект с правильным источником звука, но при запуске функции, вызывающей "частную" функцию, он вызывает неправильный аудиофайл.

Я обновил jsfiddle, чтобы показать, что происходит. Я думал, что будет предупреждать "test1", затем "test2", но он дважды предупреждает "test2".

Обновление 2: для записи изменение частной функции на этом устраняет проблему:

function Play() {   // <<< That all I had to change!
    innerAudio.play()
}
Теги:
audio
arrays

1 ответ

0

Создаете ли вы уникальный объект aduio для каждой звуковой обертки?

var audio = new Audio();
audio.src = 'src';

var audioObj = new AudioObject(audio);
AudioObjects.push(audioObj);
  • 0
    Я уверен, что я есть. Это строка, которая создает новый AudioObject .. var recObj = new AudioObject (0, audio.duration, audio); В момент создания объекта «audio» ссылается на источник, отличный от AudioObject в моем массиве AudioObjects. Однажды я нажимаю на этот новый объект, который изменяется в массиве.
  • 0
    Ах! Я нашел свою проблему! Я обновляю свой оригинальный пост.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню