我正在循环浏览页面上的所有 .jplayer 类,然后对每个找到的类进行 ajax 调用,该调用返回与播放器关联的每首歌曲的 url。我想等到所有 ajax 调用完成并执行所有成功回调(即,所有 jplayer 实例都被实例化),然后在我的容器元素上运行 isotope。
我最初尝试运行 isotope 作为 loadTracks 方法的回调,但这不起作用,因为 ajax 调用在所有玩家实例化之前返回。当同位素试图确定页面的布局时,这会导致问题,因为每个玩家可以有不同的高度。
这是我当前检索播放器曲目的代码:
function loadTracks(players, callback) {
players.each(function(i,elem) {
var playerId = $(this).attr('id'),
arr = playerId.split('_'),
postId = arr[2];
$.ajax({
url: BaseHref + "api/v1/Post/" + postId + '/PostTracks',
dataType: "json",
success: function(data) {
var cssSelector = {
jPlayer: '#jquery_jplayer_' + postId,
cssSelectorAncestor: '#jp_container_' + postId
}
var playlist = [];
makePlaylist = (function() {
$.each(data.data, function(index,value) {
playlist.push({
title: value['Title'],
m4a: value['m4aURL'],
ogg: value['oggURL']
});
});
})();
var options = {
swfPath: BaseHref + 'themes/simple/javascript/jplayer',
supplied: 'm4a, oga',
displayTime: 0,
addTime: 0,
removeTime: 0,
shuffleTime: 0,
enableRemoveControls: true
};
var myPlaylist = new jPlayerPlaylist(cssSelector, playlist, options);
}
});
});
callback();
}
然后我运行:
loadTracks($('.jp-jplayer'), function() {
$container.imagesLoaded(function() {
$container.isotope({
itemSelector : selector,
transformsEnabled: false,
visibleStyle: { opacity: 1 },
hiddenStyle: { opacity: 0 },
resizable: false,
masonry: {
columnWidth: setColumns($container),
gutterWidth: 10
},
getSortData: {
date: function ( $elem ) {
return $elem.data('date');
}
},
sortBy: 'date',
sortAscending: false
});
});
if ( $('#overlay').length ) setTimeout(function() { $('#overlay').fadeOut(); }, 1000);
})
只有在我的 $.each 循环中的所有 ajax 调用都返回并且所有 jplayer 实例都已通过成功方法实例化之后,我如何才能在我的容器上执行同位素方法?