【问题标题】:MediaElement.js + jQuery with improved playlist (hopefully)MediaElement.js + jQuery 改进了播放列表(希望如此)
【发布时间】:2012-12-12 18:31:48
【问题描述】:

我的 JavaScript 框架:jQuery 1.8.3

使用 mediaelement.js 和播放列表播放音频(来自这个线程) mediaelement.js and custom playlist

我一直在试图弄清楚如何更改脚本(在底部)以使用这种列表:

 <ul class="mejs-list">
     <li class="current"><a href="/media/file-1.mp3">Nice Name for file1</a> 
       other random text or html/img, file description etc </li>
    <li><a href="/media/file-2.mp3">Nice Name for file2</a>other text or html/img</li>
    <li><a href="/media/file-3.mp3">Nice Name for file3</a>other text or html/img</li>
</ul>

而不是这个

<ul class="mejs-list">
  <li>/media/file-1.mp3</li>
  <li class="current">/media/file-2.mp3</li>
  <li>/media/file-3.mp3</li>
</ul>

这个脚本把这个列表变成一个播放列表,效果很好,但是创建了显示完整路径的链接,我更喜欢从链接中获取 src 而不是 li 中的文本,所以我可以使用更好的名称。

<script>
$(function(){
    $('audio').mediaelementplayer({
        success: function (mediaElement, domObject) {
            mediaElement.addEventListener('ended', function (e) {
                mejsPlayNext(e.target);
            }, false);
        },
        keyActions: []
    });

    $('.mejs-list li').click(function() {
        $(this).addClass('current').siblings().removeClass('current');
        var audio_src = $(this).text();
        $('audio#mejs:first').each(function(){
            this.player.pause();
            this.player.setSrc(audio_src);
            this.player.play();
        });
    });

});

function mejsPlayNext(currentPlayer) {
    if ($('.mejs-list li.current').length > 0){ // get the .current song
        var current_item = $('.mejs-list li.current:first'); // :first is added if we have few .current classes
        var audio_src = $(current_item).next().text();
        $(current_item).next().addClass('current').siblings().removeClass('current');
        console.log('if '+audio_src);
    }else{ // if there is no .current class
        var current_item = $('.mejs-list li:first'); // get :first if we don't have .current class
        var audio_src = $(current_item).next().text();
        $(current_item).next().addClass('current').siblings().removeClass('current');
        console.log('elseif '+audio_src);
    }

    if( $(current_item).is(':last-child') ) { // if it is last - stop playing
        $(current_item).removeClass('current');
    }else{
        currentPlayer.setSrc(audio_src);
        currentPlayer.play();
    }
}
</script>

如果使用 jQuery 和 mediaelement.js 有更好的方法,我愿意接受建议。

附言
如果我可以有上一个和下一个曲目链接,那也是一个加号,但这不是必需的。

【问题讨论】:

    标签: javascript jquery jquery-events mediaelement.js playlist


    【解决方案1】:

    想出来并发布答案以供大家受益。

    HTML

    <audio id="mejs" src="track1.mp3" type="audio/mp3" controls></audio>
    <ul class="mejs-list">
      <li id="track1.mp3">Track1</li>
      <li id="track2.mp3">Track2</li>
      <li id="track3.mp3">Track3</li>
    </ul>
    

    javascript

        <script>
            $(function(){
                $('audio').mediaelementplayer({
                    success: function (mediaElement, domObject) {
                        mediaElement.addEventListener('ended', function (e) {
                            mejsPlayNext(e.target);
                        }, false);
                    },
                    keyActions: []
                });
    
                $('.mejs-list li').click(function() {
                    $(this).addClass('current').siblings().removeClass('current');
                    var audio_src = this.id;
                    $('audio#mejs:first').each(function(){
                        this.player.pause();
                        this.player.setSrc(audio_src);
                        this.player.play();
                    });
                });
    
            });
    
            function mejsPlayNext(currentPlayer) {
                if ($('.mejs-list li.current').length > 0){ // get the .current song
                    var current_item = $('.mejs-list li.current:first'); // :first is added if we have few .current classes
                    var audio_src = $(current_item).next().text();
                    $(current_item).next().addClass('current').siblings().removeClass('current');
                    console.log('if '+audio_src);
                }else{ // if there is no .current class
                    var current_item = $('.mejs-list li:first'); // get :first if we don't have .current class
                    var audio_src = $(current_item).next().text();
                    $(current_item).next().addClass('current').siblings().removeClass('current');
                    console.log('elseif '+audio_src);
                }
    
                if( $(current_item).is(':last-child') ) { // if it is last - stop playing
                    $(current_item).removeClass('current');
                }else{
                    currentPlayer.setSrc(audio_src.match('http.*\.mp3'));
                    currentPlayer.play();
                }
            }
            </script>
    

    注意:这不会验证 HTML 标准(WC3),但它确实有效,经过测试 Mac 上的 Chrome、Safari、Firefox,最新版本 仍在寻找 HTML 兼容版本进行验证。

    【讨论】:

      【解决方案2】:

      我觉得应该是的

       $(current_item).next().attr('id');
      

      在 mejsPlayNext 函数中。

       <script>
          $(function(){
              $('audio').mediaelementplayer({
                  success: function (mediaElement, domObject) {
                      mediaElement.addEventListener('ended', function (e) {
                          mejsPlayNext(e.target);
                      }, false);
                  },
                  keyActions: []
              });
      
              $('.mejs-list li').click(function() {
                  $(this).addClass('current').siblings().removeClass('current');
                  var audio_src = this.id;
                  $('audio#mejs:first').each(function(){
                      this.player.pause();
                      this.player.setSrc(audio_src);
                      this.player.play();
                  });
              });
      
          });
      
          function mejsPlayNext(currentPlayer) {
              if ($('.mejs-list li.current').length > 0){ // get the .current song
                  var current_item = $('.mejs-list li.current:first'); // :first is added if we have few .current classes
                  var audio_src = $(current_item).next().attr('id');
                  $(current_item).next().addClass('current').siblings().removeClass('current');
                  console.log('if '+audio_src);
              }else{ // if there is no .current class
                  var current_item = $('.mejs-list li:first'); // get :first if we don't have .current class
                  var audio_src = $(current_item).next().attr('id');
                  $(current_item).next().addClass('current').siblings().removeClass('current');
                  console.log('elseif '+audio_src);
              }
      
              if( $(current_item).is(':last-child') ) { // if it is last - stop playing
                  $(current_item).removeClass('current');
              }else{
                  currentPlayer.setSrc(audio_src.match('http.*\.mp3'));
                  currentPlayer.play();
              }
          }
          </script>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多