背景:我有一个网站根据搜索条件一次加载音频文件(1-50 个)。用户可以随时调整搜索以查看数千个音频文件的库。页面不会刷新,但会通过 AJAX 提供结果。我不能将音频标签设置为 preload="auto" 因为如果同时加载 50 个音轨,并且搜索不断变化并且搜索的人超过一个,那么浏览器将崩溃。这没什么大不了的,因为有一个解决方案。该解决方案虽然不是 100% 防弹的,如果以正确的方式完成,可能会导致音频文件的加载完全不会发生。
代码:要开始在 mouseenter 上加载音频文件,我这样做:
$("#mainSelector").on('mouseenter', '.classOfAudioFiles', function() { 变种音频, 剥离ID, $last_played = $('#last_played').val(); strippedId = this.id.substring(15); 音频 = $('#audio_'+strippedId).get(0); if($last_played != 'audio_'+strippedId){ console.log('over'); 音频.play(); 音频.暂停(); audio.addEventListener("canplaythrough", function(){ console.log('准备好了'); } ); } });
要通过单击按钮播放音频文件,而不是播放按钮,我这样做:
$("#mainSelector").on('click', '.classOfAudioFiles, .classOfAudioFiles2', function(event) { //停止所有播放音频 $.each($('audio'), function () { this.pause(); }); //变量 变种音频, $last_played = $('#last_played'), alreadyPlaying = $('#' + $last_played.val()).get(0), $hideLastOpened = $last_played.val().substring(6), 停止所有动作, 点击TrackId; if(this.id.substring(0,15) == 'classOfAudioFiles2'){ clickTrackId = this.id.substring(16); console.log('title'); }别的{ clickTrackId = this.id console.log('按钮'); } if($('#last_played').val() != 'audio_'+clickingTrackId){ //alert($last_played+' --- audio_'+clickingTrackId); //隐藏上次打开的 $('#playTrack'+$hideLastOpened).hide(); //显示加号 $('#closePlus'+$hideLastOpened).show(); //已经播放 = 0; } //设置最后播放 $last_played.val('audio_'+clickingTrackId); //创建音频 音频 = $('#audio_'+clickingTrackId).get(0); audio.addEventListener("canplaythrough", function(){ console.log('ready2'); } ); if($hideLastOpened == $('#last_played').val().substring(6)){ $('#last_played').val('audio_1000'); 停止所有动作 = 1; }别的{ 停止所有动作 = 0; } if (alreadyPlaying != undefined && stopAllActions == 1){ 已经播放.pause(); }别的{ //延迟播放 设置超时(函数(){ 音频.play(); }, 250); } });
问题:在上述任何一个代码中,我是否遗漏了什么可以确保音频文件在 100% 的时间内播放(延迟略有帮助,但不是 100%)?这更像是服务器问题吗,例如内存?还是它依赖于客户端,因此服务器调整不会做任何事情?