Я работаю над созданием объекта для обертывания элементов управления элементами экземпляров 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()
}
Создаете ли вы уникальный объект aduio для каждой звуковой обертки?
var audio = new Audio();
audio.src = 'src';
var audioObj = new AudioObject(audio);
AudioObjects.push(audioObj);