在使用JavaScript的html5自定义播放器中加载音频的同时加载/缓冲文本

时间:2018-08-09 20:10:32

标签: javascript jquery html5-audio audio-player

我找到了一个自定义的html5音频播放器,并成功地对其进行了重新设计,现在我想在播放器加载音频的同时添加一个“加载/缓冲”文本(否则用户可能会发疯,因为点击播放后没有任何反应)。

下面是解释代码:

function calculateTotalValue(length) {
  var minutes = Math.floor(length / 60),
    seconds_int = length - minutes * 60,
    seconds_str = seconds_int.toString(),
    seconds = seconds_str.substr(0, 2),
    time = minutes + ':' + seconds

  return time;
}

function calculateCurrentValue(currentTime) {
  var current_hour = parseInt(currentTime / 3600) % 24,
    current_minute = parseInt(currentTime / 60) % 60,
    current_seconds_long = currentTime % 60,
    current_seconds = current_seconds_long.toFixed(),
    current_time = (current_minute < 10 ? "0" + current_minute : current_minute) + ":" + (current_seconds < 10 ? "0" + current_seconds : current_seconds);

  return current_time;
}

function initProgressBar() {
  var player = document.getElementById('player');
  var length = player.duration
  var current_time = player.currentTime;

  // calculate total length of value
  var totalLength = calculateTotalValue(length)
  jQuery(".end-time").html(totalLength);

  // calculate current value time
  var currentTime = calculateCurrentValue(current_time);
  jQuery(".start-time").html(currentTime);

  var progressbar = document.getElementById('seekObj');
  progressbar.value = (player.currentTime / player.duration);
  progressbar.addEventListener("click", seek);

  if (player.currentTime == player.duration) {
    $('#play-btn').removeClass('pause');
  }

  function seek(evt) {
    var percent = evt.offsetX / this.offsetWidth;
    player.currentTime = percent * player.duration;
    progressbar.value = percent / 100;
  }
};

function initPlayers(num) {
  // pass num in if there are multiple audio players e.g 'player' + i

  for (var i = 0; i < num; i++) {
    (function() {

      // Variables
      // ----------------------------------------------------------
      // audio embed object
      var playerContainer = document.getElementById('player-container'),
        player = document.getElementById('player'),
        isPlaying = false,
        playBtn = document.getElementById('play-btn');

      // Controls Listeners
      // ----------------------------------------------------------
      if (playBtn != null) {
        playBtn.addEventListener('click', function() {
          togglePlay()
        });
      }

      // Controls & Sounds Methods
      // ----------------------------------------------------------
      function togglePlay() {
        if (player.paused === false) {
          player.pause();
          isPlaying = false;
          $('#play-btn').removeClass('pause');

        } else {
          player.play();
          $('#play-btn').addClass('pause');
          isPlaying = true;
        }
      }
    }());
  }
}

initPlayers(jQuery('#player-container').length);

CodePen上的播放器代码(源)

  1. 我希望一些文字显示在与 媒体加载时的“开始时间”(请参阅​​CodePen);
  2. 文本“正在加载”。 “正在加载...”“正在加载...” 媒体加载时循环播放;
  3. 在加载时,“加载”文本必须在“开始”时更改 时间”。

所以基本上我想在开始时放一些文本,而除了零以外什么都不显示

我是JS新手

这就是为什么我需要一些帮助或指向正确的方向

2 个答案:

答案 0 :(得分:1)

您可以使用音频播放器的“ readyState”事件来显示隐藏加载。 甚至已经有一个“ SetInterval”被触发,因此我们可以添加此代码以显示/隐藏“ Loading”

首先添加加载元素(您可以将其放置在任意位置”

<h3 id="loading" style="display:none;">Loading</h3>

现在让我们添加代码以检查“ SetInterval”中的“ readystate”

if(player.readyState>0&&player.readyState<4){
    $("#loading").show();
  }
  else{
    $("#loading").hide();
  }

您可以阅读有关“就绪状态” here

的更多信息

/根据请求,我更改了代码以使用开始时间进行加载,以使其正常运行,我们不必在html内添加任何内容,而是需要在JS中进行一些更改

首先,在“ else”块中的“ togglePlay”函数支付条件中添加此代码。

$(".start-time").html("Loading...");

在此之后,在“ initProgressBar()”函数内部替换“ jQuery(“。start-time”)。html(currentTime);“使用以下代码

 if (player.readyState === 4) {
    jQuery(".start-time").html(currentTime);
  }

所以它将如何工作,当您单击播放按钮时,开始时间文本将显示为“正在加载”,但是一旦文件被加载并且播放器准备播放,文本将被更改为“开始时间”,希望它作品。还更新了CodePen,以更好地理解

您可以在CodePen

中找到完整的代码

答案 1 :(得分:0)

您可以使用setInterval来循环浏览不同的“加载”文本,并在播放器完成clearInterval后使用promise

这是一个基本示例:

var dots = 1;
var loading = setInterval(function(){ 
  dots = (dots % 3) + 1;
  $(".start-time").text("Loading" + Array(dots + 1).join("."));
  console.log($(".start-time").text());
}, 250);

player.play().then(function() {
  clearInterval(loading); 
}).catch((error) => {
  $(".start-time").text("Error loading");
});