LINUX.ORG.RU

Как лучше подгружать аудио

 ,


0

1

Всем привет. Вопрос, собственно выше. На сайте есть куча элементов, при клике на которых проигрываются небольшие аудио-файлы,, размером ~30Kb. Используются два варианта:

В первом случае файл подхватывается после клика, и, предполагаю, что у товарищей с медленным соединением, или если файл вдруг будет большой, звук заиграет с задержкой.

// первый вариант
elements.forEach(function(el) {
  el.addEventListener('click', function() {
    var src =  el.dataset.src,
        a = new Audio(src);
    a.play();
  }, false);
});

Во втором случае для каждого элемента создаётся объект, куда толкается и сам элемент и аудио.

// второй вариант
var arr = [];
elements.forEach(function(el) {
  var obj = {};
  obj.self = el;
  obj.audio = (function(path) {
    var a = new Audio(path);
    a.preload = "auto";
    return a;
  })(path);
  arr.push(obj);
});
arr.forEach(function(el) {
  el.self.onclick = function() {
    el.audio.play();
  };
});

Есть ли смысл этих объектов? И загружается ли аудио-файл, когда он вкладывается в объект? Такие вот вопросы. Спасибо.

И загружается ли аудио-файл, когда он вкладывается в объект?

Во-первых, очень просто отдебажить, а если нет навыков дебажить такие примитивные вещи - дальше будет очень плохо. Во-вторых, конечно нет, загружать он начинает когда el.audio.play() в втором варианте.

Звуковые файлы нужно подгружать в бекграунде сразу после загрузки и отрисовки страницы. Не важно будет юзер что-то пикающее нажимать или нет.

BigAlex ★★★
()
Последнее исправление: BigAlex (всего исправлений: 1)
Ответ на: комментарий от BigAlex

Хотя погодьте. Попробовал, если это можно так назвать, отдебажить (хороший совет, кстати) и используя второй вариант (примерно), при загрузке страницы в консоли браузера вывалился список со всеми этими мелкими аудио-файлами полученных GET'ом. И далее при клике, уже не было ни запроса, ни ответа, всё звучало. Гуд.

Но, теперь стало интересно, куда он их грузит.. не в оперативку ли. Надо как-нибудь попробовать подсунуть ему альбом в lossless, а не эту мелочь

morisRavel
() автор топика

Во втором случае

Во втором случае вам 2 цикла не нужны. Как-то так:

arr = [];
elements.forEach(function(el) {
   var o
   with(o={self: el, audio: new Audio(path)}){
     self=el
     self.onclick=function(){o.audio.play()}
     audio.preload="auto"
     arr.push(o)
   }
});

должно работать

anonymous
()
Ответ на: комментарий от anonymous

Точней, даже так

elements.forEach(function(el) {
   var o
   with(o={self: el, audio: new Audio(path)}){
     self.onclick=function(){o.audio.play()}
     audio.preload="auto"
     arr.push(o)
   }
});

anonymous
()
Ответ на: комментарий от morisRavel

Но, теперь стало интересно, куда он их грузит..

Если так, то в кэш. Далее все размышления браузерозависимы, но уверен, что просто падают на диск. Вы там ради интереса посмотрите правильно ли кешируется или на каждую перезагрузку страницы все выкачивается каждый раз.

BigAlex ★★★
()
Ответ на: комментарий от anonymous

with(o={

Да, так удобнее. with, почему-то редко использую.

morisRavel
() автор топика
Ответ на: комментарий от BigAlex

правильно ли кешируется или на каждую перезагрузку страницы все выкачивается каждый раз

Правильно или нет, не знаю, но кэшируется. Т.е. при каждой перезагрузке страницы не выкачивает заново.

morisRavel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.