【问题标题】:Loading/Buffering text while loading audio in html5 custom player with JavaScript使用 JavaScript 在 html5 自定义播放器中加载音频时加载/缓冲文本
【发布时间】:2018-08-09 20:10:31
【问题描述】:

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

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

我是 JS 新手

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

【问题讨论】:

    标签: javascript jquery html5-audio audio-player


    【解决方案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();
      }
    

    你可以阅读更多关于“readystate”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找到完整的代码

    【讨论】:

    • 你着火了! @Shubham,这正是我想要的!非常感谢您的帮助
    • 是否可以将它放在开始时间跨度,只有在加载文本消失后才会显示计时器? @Shubham
    • 也许我应该在我之前的评论中更具体一些,我说的是两个计时器只有在加载完成并且加载文本消失后才会出现@Shubham
    • @AndrewK 不是问题,endtime html 也需要添加到条件中,我会做更改
    • 谢谢!再次感谢@Shubham,我认为我们可以将此问题视为已回答。)
    【解决方案2】:

    当玩家的游戏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");
    });
    

    【讨论】:

    • 我想我明白了,但我一开始的主要挑战是如何让它在相同的代码中工作:状态一:开始时间“跨度”没有显示任何内容;第二步:用户点击播放 - 在加载媒体时加载开始时间“span”显示的文本;状态三:媒体已加载并播放 - 时间值显示在开始时间“span”中。我需要它是对现有 JS 的“轻微”调整,因为在用户点击播放之前,开始时间“跨度”被用于另一项任务。 @DéricDallaire
    • 是的,只需在您的 togglePlay 方法的 else 块中使用我的代码,您就会得到预期的结果。如果承诺解决得太快,则单击播放时可能看不到加载。尝试加载更大的文件。见codepen
    • 这正是我告诉你的,“加载”正在更改为 00:00(归零)时间值,然后一段时间内什么都没有发生,用户可能会认为播放器是堆栈,所以我想要“加载文本”将一直显示,直到开始计时器开始倒计时(直到用户听到播放器实际播放音乐)。@DéricDallaire
    • 是的,在加载文件时,会出现“正在加载”文本。考虑到文件加载速度很快,加载并不总是有时间显示,因为它会立即开始。我修改了 codepen 来模拟一个需要 5 秒才能加载的文件。更好地掌握 Promises 在 javascript 中的工作原理很重要。在播放器的上下文中,承诺“在开始播放时履行,或者如果由于任何原因无法开始播放,则被拒绝”。 src
    • 我在手机上再次打开了你的 codpen,这次它卡在加载循环中,并且播放按钮更改延迟。在我之前的评论之后你改变了什么吗? (测试了原始代码 - 现在它在我的手机上运行良好)@DéricDallaire
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多