2015-09-04 45 views
1

这里播放的歌曲是我的JS:jPlayer不是播放列表对象中的全局声明

$(document).ready(function(){ 
    var cssSelector = { 
     jPlayer: "#jplayer_N", 
     cssSelectorAncestor: "#jp_container_N" 
    }; 

    var playlist = []; 

    var options = { 
     playlistOptions: { 
      enableRemoveControls: true, 
      autoPlay: true 
     }, 
     swfPath: "js/jPlayer", 
     supplied: "webmv, ogv, m4v, oga, mp3", 
     smoothPlayBar: true, 
     keyEnabled: true, 
     audioFullScreen: false 
    }; 

    var myPlaylist = new jPlayerPlaylist(cssSelector, playlist, options); 

    function loadSong(){ 
     var song_artist = findArtist(); 
     var song_title = findTitle(); 
     var song_poster = findPoster();  

     myPlaylist.add({ 
      title: song_title, 
      artist: song_artist, 
      oga: sessionStorage.getItem("file_url"), 
      poster: song_poster 
     }); 

     $(document).on($.jPlayer.event.pause, myPlaylist.cssSelector.jPlayer, function(){ 
      $('.musicbar').removeClass('animate'); 
      $('.jp-play-me').removeClass('active'); 
      $('.jp-play-me').parent('li').removeClass('active'); 
     }); 

     $(document).on($.jPlayer.event.play, myPlaylist.cssSelector.jPlayer, function(){ 
      $('.musicbar').addClass('animate'); 
     }); 

     $(document).on('click', '.jp-play-me', function(e){ 
      e && e.preventDefault(); 
      var $this = $(e.target); 
      if (!$this.is('a')) $this = $this.closest('a'); 

      $('.jp-play-me').not($this).removeClass('active'); 
      $('.jp-play-me').parent('li').not($this.parent('li')).removeClass('active'); 

      $this.toggleClass('active'); 
      $this.parent('li').toggleClass('active'); 
      if(!$this.hasClass('active')){ 
       myPlaylist.pause(); 
      }else{ 
       var i = Math.floor(Math.random() * (1 + 7 - 1)); 
       myPlaylist.play(i); 
      } 
     }); 
    }  
}); 

在调用LoadSong来(),我可以看到我的歌曲的myPlaylist.playlist数组中得到排队。但是,jPlayer不会播放我的歌曲。

而且,在某种程度上,这似乎却为我工作:

$(document).ready(function(){ 
    var cssSelector = { 
     jPlayer: "#jplayer_N", 
     cssSelectorAncestor: "#jp_container_N" 
    }; 

    var playlist = []; 

    var options = { 
     playlistOptions: { 
      enableRemoveControls: true, 
      autoPlay: true 
     }, 
     swfPath: "js/jPlayer", 
     supplied: "webmv, ogv, m4v, oga, mp3", 
     smoothPlayBar: true, 
     keyEnabled: true, 
     audioFullScreen: false 
    }; 

    function loadSong(){ 
     var song_artist = findArtist(); 
     var song_title = findTitle(); 
     var song_poster = findPoster();  

     var myPlaylist = new jPlayerPlaylist(cssSelector, playlist, options); 

     myPlaylist.add({ 
      title: song_title, 
      artist: song_artist, 
      oga: sessionStorage.getItem("file_url"), 
      poster: song_poster 
     }); 

     $(document).on($.jPlayer.event.pause, myPlaylist.cssSelector.jPlayer, function(){ 
      $('.musicbar').removeClass('animate'); 
      $('.jp-play-me').removeClass('active'); 
      $('.jp-play-me').parent('li').removeClass('active'); 
     }); 

     $(document).on($.jPlayer.event.play, myPlaylist.cssSelector.jPlayer, function(){ 
      $('.musicbar').addClass('animate'); 
     }); 

     $(document).on('click', '.jp-play-me', function(e){ 
      e && e.preventDefault(); 
      var $this = $(e.target); 
      if (!$this.is('a')) $this = $this.closest('a'); 

      $('.jp-play-me').not($this).removeClass('active'); 
      $('.jp-play-me').parent('li').not($this.parent('li')).removeClass('active'); 

      $this.toggleClass('active'); 
      $this.parent('li').toggleClass('active'); 
      if(!$this.hasClass('active')){ 
       myPlaylist.pause(); 
      }else{ 
       var i = Math.floor(Math.random() * (1 + 7 - 1)); 
       myPlaylist.play(i); 
      } 
     }); 
    }  
}); 

但是,每次我打电话LoadSong来()函数的时候,我不能使用这是什么原因,一个新的myPlaylist对象获得创造每一次,让我一次只播放一首歌曲。正如我试图生成播放列表,我想要一个静态/全局(不完全知道该怎么称呼它)myPlaylist对象的实例,使用它我将歌曲添加到播放列表。按照this我不应该有任何问题。另外,为了确保myPlaylist的范围,我也尝试过creating static properties and methodsthis,但这也没有任何帮助。我只是无法弄清楚什么是错误的,离开一个具体的解决方案。

任何人都可以请指出我要去哪里错了,在这种情况下可以做些什么?

回答

0

对迟交的道歉。

谢谢@ Gyrocode.com您的及时答复,但您的解决方案生成了与我的问题中提到的结果相同的结果。

什么工作对我来说是:

$(document).ready(function(){ 
    var cssSelector = { 
     jPlayer: "#jplayer_N", 
     cssSelectorAncestor: "#jp_container_N" 
    }; 

    var playlist = []; 

    var options = { 
     playlistOptions: { 
      enableRemoveControls: true, 
      autoPlay: true 
     }, 
     swfPath: "js/jPlayer", 
     supplied: "webmv, ogv, m4v, oga, mp3", 
     smoothPlayBar: true, 
     keyEnabled: true, 
     audioFullScreen: false 
    }; 

    var myPlaylist = null; 

    function loadSong(){ 
     var song_artist = findArtist(); 
     var song_title = findTitle(); 
     var song_poster = findPoster();  

     if(myPlaylist == null) 
      myPlaylist = new jPlayerPlaylist(cssSelector, playlist, options); 

     myPlaylist.add({ 
      title: song_title, 
      artist: song_artist, 
      oga: sessionStorage.getItem("file_url"), 
      poster: song_poster 
     }); 

     $(document).on($.jPlayer.event.pause, myPlaylist.cssSelector.jPlayer, function(){ 
      $('.musicbar').removeClass('animate'); 
      $('.jp-play-me').removeClass('active'); 
      $('.jp-play-me').parent('li').removeClass('active'); 
     }); 

     $(document).on($.jPlayer.event.play, myPlaylist.cssSelector.jPlayer, function(){ 
      $('.musicbar').addClass('animate'); 
     }); 

     $(document).on('click', '.jp-play-me', function(e){ 
      e && e.preventDefault(); 
      var $this = $(e.target); 
      if (!$this.is('a')) $this = $this.closest('a'); 

      $('.jp-play-me').not($this).removeClass('active'); 
      $('.jp-play-me').parent('li').not($this.parent('li')).removeClass('active'); 

      $this.toggleClass('active'); 
      $this.parent('li').toggleClass('active'); 
      if(!$this.hasClass('active')){ 
       myPlaylist.pause(); 
      }else{ 
       var i = Math.floor(Math.random() * (1 + 7 - 1)); 
       myPlaylist.play(i); 
      } 
     }); 
    }  
}); 

就是这样。只需添加一个if即可初始化播放列表对象(如果尚未初始化)。它的功能就像一个魅力!

0

SOLUTION

你需要移动jPlayerPlaylist初始化和事件处理的loadSong之外,使myPlaylist一个全局变量。

DEMO

this jsFiddle代码和演示。