【发布时间】:2018-05-16 12:50:50
【问题描述】:
我已经阅读了很多人的类似问题,但没有找到答案。所以我在问我自己的问题。
我一直在构建一项功能,允许我的用户播放他们正在查看的页面上的所有音轨。但是,为了让我的音频播放器最初出现在页面上,当用户单击“全部播放”按钮时,我必须至少 initPlayer() 一次。
问题是,我正在使用 for 循环遍历数组中的所有歌曲 ID,以用歌曲填充播放列表。
var theids = ids.split(",");
for (var i = 0; i < theids.length; i++) {
getItem(theids[i], type).done(function(obj) {
if (obj.status == 'success') {
mep.mepPlaylistTracks = obj.tracks;
initPlayer();
addToPlay(obj.tracks, play);
}
});
}
initPlayer() 依靠来自我的getItem() 函数的信息来正确启动第一次。所以必须按这个顺序放置。
有没有办法在我的for 循环中只触发一次我的initPlayer() 函数?每次将歌曲添加到播放列表时,它都会导致我的播放器重新启动,从而导致性能和视觉问题。
这种事情在 Javascript 中是可能的吗?
编辑以添加initPlayer() 和getItem() 函数。我是Javascript 的新手,感谢您的帮助。
// init player
function initPlayer(){
$('.app-player').removeClass('hide');
$('#app').removeClass('hide-player');
var playlist = $( '.playlist' ).mepPlaylist({
audioHeight: '40',
audioWidth: '100%',
videoHeight: '40',
videoWidth: '100%',
audioVolume: 'vertical',
mepPlaylistLoop: true,
alwaysShowControls: true,
mepSkin: 'mejs-audio',
mepResponsiveProgress: true,
mepAutoPlay: false,
mepSelectors: {
playlist: '.playlist',
track: '.track',
tracklist: '.tracks'
},
features: [
//'meplike',
'mepartwork',
'mepcurrentdetails',
'mepplaylist',
'mephistory',
'mepprevioustrack',
'playpause',
'mepnexttrack',
'progress',
'current',
'duration',
'volume',
'mepicons',
'meprepeat',
'mepshuffle',
'mepsource',
'mepbuffering',
'meptracklist',
'mepplaylisttoggle',
'youtube'
],
mepPlaylistTracks: mep.mepPlaylistTracks
});
function getItem(id, type){
return $.ajax({
type : "post",
dataType : "json",
url : ajax.ajax_url,
data : {action: "ajax_music", id: id, type: type, nonce: ajax.nonce}
});
}
【问题讨论】:
-
一个“循环”和“一次”没有意义......不要使用循环,那么你将运行一次代码......
-
“医生,我这样做会很痛!” ...好吧,那就不要这样做了。
-
你不能在页面加载时运行一次
initPlayer吗? -
您的前提是“必须按此顺序放置”不一定正确。您还没有向我们展示
initPlayer中的内容或getItem中的内容,那么我们如何才能帮助您? -
我认为您正在寻找的真正解决方案是:Wait until all jQuery Ajax requests are done
标签: javascript function for-loop