【问题标题】:Wait for jPlayer to finish loading files before continuing loop在继续循环之前等待 jPlayer 完成加载文件
【发布时间】:2010-09-26 23:37:47
【问题描述】:

我正在使用 jQuery 音频播放器“jPlayer”,我有一个循环,它创建许多 jPlayer 唯一实例,然后为每个实例分配一个单击“jPlayer 播放”到文档的另一部分。问题是jPlayer 使用内部ready: function() {} 分配音频路径并加载文件。我需要等待此函数完成才能继续循环。

伪代码是这样的:

for loop{

create jPlayer div;

instantiate jPlayer and assign audio file in the ready(); // need to wait before continuing

assign an on click event to play file;
}

我确信它是关于使用队列,但我不知道如何实现它?任何帮助将不胜感激!

【问题讨论】:

    标签: javascript jquery jplayer


    【解决方案1】:

    你可以试试这样的:

    function initPlayer(playerQueue){
      if(playerQueue.length > 0) {
        var player = playerQueue.pop(); // get our options hash for this iteration
        var container = $('<div id="'+player.container+'"></div>').appendTo('body');
    
        $(container).jPlayer({
          ready: function(){
            var _e = this.element;
            _e.jPlayer('setFile', player.file);
            var timer = setInterval(function(){
                if(_e.jPlayer('getData', 'diag.loadPercent') == 100){
                   $(player.control).click(function(){
                      // assign your handler
                   });
                   clearInterval(timer); // clear the interval
                   initPlayer(playerQueue); // invoke the next player init
                }
            },500);
          },
          /* ... other options ... */
        });
      }
    }
    
    initPlayer([
      {container: 'audio-1', file: 'uri/for/file', control: '#button-1'},
      {container: 'audio-2', file: 'uri/for/file', control: '#button-2'},
      {container: 'audio-3', file: 'uri/for/file', control: '#button-3'},
      {container: 'audio-4', file: 'uri/for/file', control: '#button-4'}
    ]);
    

    基本上我们摆脱了显式循环,而是使用 ready 函数本身通过 initPlayer 函数推进构建迭代。通过使用数组,我们可以使用pop(),它将获取数组的最后一个元素,同时将其从数组中删除。我们等待调用initPlayer,直到通过每 500 毫秒轮询播放器的负载百分比获得 100 的负载百分比。

    这只是一个建议,可能需要做很多工作......我从未使用过 jPlayer,而且我从文档中瞎了眼,所以不要指望它开箱即用 :-)。

    【讨论】:

    • 你绝对是个天才!非常感谢,我真的很感激,我不得不把它弄乱一点,添加 jPlayer('load');在我们指定实际加载它的文件路径之后.. jPlayer 喜欢返回 99.9999999 而不是 100 这很奇怪。我每次都收到“未捕获的类型错误:无法读取未定义的属性‘容器’”(代码 sn-p 上的第 4 行)。尽管希望如此,但会彻底解决..再次感谢! (:
    • hmm 在 div 创建的行之前添加一个 console.log(player); console.log(playerQueue); 以在 Firefox/Firebug 中进行调试,并查看每个的内容是什么。该错误会让我担心存在范围问题,这将是这种方法的一个大问题。它们可能可以通过将您的对象数组显式附加到windowobject 并显式调用它来解决:-)
    • 啊,只是按照你说的做了,出于某种原因,我删除了 if(playerQueue.length > 0).. 所以它试图处理空数组。谢谢你:) !!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多