Javascript在音频文件中间歇性地出现错误

Javascript在音频文件中间歇性地出现错误,javascript,html5-audio,Javascript,Html5 Audio,我有一个脚本,它允许我点击一个div,以给定的偏移量开始一个音频曲目(从而充当一个提示)。我在一页中有几个这样的div。在某些情况下,只有按顺序进行比赛,他们才会比赛。在其他情况下,偏移被误解。例如,当我有这个div时: <script> var status = 'S' ; function pausecomp(ms) { ms += new Date().getTime(); while (new Date() < m

我有一个脚本,它允许我点击一个div,以给定的偏移量开始一个音频曲目(从而充当一个提示)。我在一页中有几个这样的div。在某些情况下,只有按顺序进行比赛,他们才会比赛。在其他情况下,偏移被误解。例如,当我有这个div时:

    <script>
    var status = 'S' ;
    function pausecomp(ms) {
        ms += new Date().getTime();
        while (new Date() < ms){}
    }

    function play_it( aud_id ) {
        if ( status == 'S' ) {
            var offset = $("#"+aud_id+"_offset")[0].value ;
            if ( offset > $("#" + aud_id )[0].duration ) { alert ( "offset beyond end of track" ); return; }
            $("#" + aud_id)[0].currentTime = offset ;
            $("#" + aud_id)[0].volume = 1 ;
            $("#" + aud_id)[0].play() ;
            status = 'P' ;
            $("#"+aud_id+"_div").css('backgroundColor', 'cyan') ;
        } else if ( status == 'P' ) {
            $("#"+aud_id+"_div").css('backgroundColor', 'green') ;
            status = 'F' ;
            fadeout( aud_id ) ;
            stop( aud_id );
            status = 'S' ;
        } else if ( status == 'F' ) {
            stop( aud_id ) ;
            status = 'S' ;
        }
    }

    function fadeout(aud_id) {
    // reduce the volume by .01 every 100 ms
        var volume = $("#" + aud_id)[0].volume ;
        var stop = 100 ;
        if ( volume > 0 ) {
            stop = Math.floor( 100*volume ) ;
        }
        for ( var i = 1 ; i < stop ; i++ ) {
            reduceVol($("#" + aud_id)[0]);
            pausecomp(60) ;
        }
        $("#" + aud_id)[0].volume = 0 ;
    }

    function reduceVol(audio_obj) {
        var volume = audio_obj.volume ;
        volume = volume - 0.01 ;
        if ( volume >= 0 ) {
            audio_obj.volume = volume ;
        }
    }

    function stop(aud_id) {
        $("#" + aud_id)[0].pause() ;
    }
    </script>   

<div style='display:inline-block; width:300px;'>
<audio id="my_audio_3">
    <source src="Artists\The Black Keys\El Camino\01.Lonely Boy.mp3" type="audio/mpeg">
</audio>
<input type='hidden' id='my_audio_3_offset' value='185.5' />
<div id='my_audio_3_div' style='background-color:lightblue; width:200px; height:100px; border:1px solid black; vertical-align:middle; text-align:center;' onclick="play_it('my_audio_3')">Artists\The Black Keys\El Camino\01.Lonely Boy.    
</div>
<button type="button" style='width:200px;' onclick="stop('my_audio_3')">Stop</button>
</div>

风险值状态='S';
函数pausecomp(毫秒){
ms+=新日期().getTime();
while(新日期()$(“#”+aud_id)[0]。持续时间){alert(“偏移量超出音轨末端”);return;}
$(“#”+aud_id)[0]。当前时间=偏移量;
$(“#”+aud_id)[0];
$(“#”+aud_id)[0].play();
状态='P';
$(“#”+aud_id+“_div”).css('backgroundColor','cyan');
}否则如果(状态='P'){
$(“#”+aud_id+“_div”).css('backgroundColor','green');
状态='F';
淡出(aud_id);
停止(aud_id);
状态='S';
}否则如果(状态='F'){
停止(aud_id);
状态='S';
}
}
功能淡出(aud_id){
//每100毫秒将音量降低0.01
var volume=$(“#”+aud_id)[0];
var-stop=100;
如果(音量>0){
停止=数学地板(100*体积);
}
对于(变量i=1;i=0){
音频对象音量=音量;
}
}
功能停止(aud_id){
$(“#”+aud_id)[0]。暂停();
}
艺术家\黑钥匙\El Camino\01.孤独的男孩。
停止

在文件本身中,偏移量工作正常。如果我把它和一堆类似的女主角放在一起,它根本就不起作用。在其他组合中,(似乎与某些文件有关,但我无法缩小其中的原因),有些在每次单击时都能正常播放,有些仅在文件首次播放前播放。

在播放之前,您需要确保要播放的音频片段已加载()。预加载属性可能会有所帮助。预加载属性对一个特定的播放问题没有任何作用。我发现有趣的是,如果我显示所有曲目的控件,它们都是静音的,除了前六个。一旦我播放并停止一首曲目,它的显示将更改为静音(预期),但页面中的下一首静音曲目将取消静音。可以同时加载多少音频曲目有限制吗?它似乎是特定于浏览器的。刚在IE中测试过,效果如预期。在Firefox中,没有加载任何曲目。