首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JavaScript在html5自定义播放器中加载音频时加载/缓冲文本

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

Stack Overflow用户
提问于 2018-08-10 04:10:32
回答 2查看 1.3K关注 0票数 2

我找到了一个自定义的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. 文本“'loading.‘’正在加载.”“正在加载...”必须在媒体加载时循环更改;
  3. 加载时,“正在加载”文本必须像现在一样在“开始时间”更改。

所以基本上我想把一些文本放在开始时间,而它只显示零

我是JS新手

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-12 23:57:46

您可以通过音频播放器的readyState事件来展示hide加载。已经有一个"SetInterval“正在被触发,所以我们可以添加这段代码来显示/隐藏”加载“。

1添加加载元素(你可以把它放在任何你想放的地方“

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

现在,让我们添加代码来检查"SetInterval“内部的"readystate”。

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

您可以阅读有关"readystate“here的更多信息

根据请求,我已经更改了代码以使用开始时间作为加载,为了让它工作,我们不需要在/As中添加任何东西,但需要在JS中做一些更改

首先,在"togglePlay“块的"else”块中的“else”函数中添加此条件。

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

在此之后,内部的"initProgressBar()“函数将"jQuery(".start-time").html(currentTime);”替换为以下代码

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

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

您可以在CodePen中找到完整的代码

票数 0
EN

Stack Overflow用户

发布于 2018-08-10 04:54:31

当播放器的play promise完成时,你可以使用setInterval在不同的“加载”文本和clearInterval之间循环。

下面是一个基本的例子:

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");
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51775069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档