等到声音结束才能使用网页

Posted

技术标签:

【中文标题】等到声音结束才能使用网页【英文标题】:Wait until sound finishes to use a web page 【发布时间】:2013-09-26 03:33:42 【问题描述】:

我需要使用 javascript / jQuery 播放声音。目前,我正在使用此代码播放声音:

var snd = new Audio('dir/file.wav');
snd.play();

我需要一个在声音结束播放之前无法使用的网页。可能在播放声音时出现某种对话。当声音结束时,modal 显示一个“Ok”按钮,按下该按钮后,您可以继续使用该页面。

【问题讨论】:

您所说的“无法使用”是什么意思,您为什么要这样? 我的意思是用户在播放声音时不能触摸屏幕上的任何东西(按钮等)。我需要这个,因为声音是用户使用网站之前需要听取的一些说明。 @Vito 我给出了一个非常简短/简单的解决方案。看看吧。 【参考方案1】:

注意:这不是跨浏览器(仅限 html5 兼容浏览器)!

对于跨浏览器兼容性,您可能需要查看此链接: What trick will give most reliable/compatible sound alarm in a browser window for most browsers


我真的不擅长解释事情,但我为你做了一个 JsFiddle。

http://jsfiddle.net/tnnjB/8/

或者这里是代码:

HTML:

<audio id="myaudio" onended="onAudioEnded();">
  <source src="http://www.dccl.org/Sounds/pchick-alarm.wav" type="audio/wav">
Your browser does not support the audio element.
</audio>

<input 
    type="button" 
    value="You cannot click me before the sound is over" 
    onclick="javascript:alert('congrats!')"
/>

JAVASCRIPT:

$(function()
    var audio = document.getElementById("myaudio");
    $.blockUI(message : "Listen to the music!" );  
    audio.play();
);

function onAudioEnded() 
    $.unblockUI();
    alert("It's over!!");
;

我用过的东西:jquery、jquery-ui、jquery BlockUI 插件、HTML5 音频标签、google。

此外,此示例不适用于 IE,因为 IE 似乎不接受位于远程主机上的音频源,但如果文件位于服务器上的本地文件,它将起作用。

希望这将帮助您实现您的需求,

马克

【讨论】:

这个看起来很酷,但是播放声音后HTML卡住了,你什么也做不了。您需要纠正什么才能使其正常工作吗? 我在FF上测试过,你用什么浏览器测试过? 刚刚在 Firefox 上测试过,效果很好(非常感谢),但在 Chrome 和 IE10 上却不行。有什么可能是错误的线索吗? 我刚刚更新了我的答案,所以现在一切都应该适用于 chrome、FireFox、IE(请参阅我的答案注释)和所有 HTML5 兼容浏览器。 非常感谢您的帮助,现在可以使用了。这正是我所需要的。【参考方案2】:

这是一种使用承诺的方法。让播放多个音频文件变得非常容易。

// makes playing audio return a promise
function playAudio(audio)
  return new Promise(res=>
    audio.play()
    audio.onended = res
  )


// how to call
async function test()
  const audio = new Audio('<url>')
  await playAudio(audio)
  // code that will run after audio finishes...

【讨论】:

【参考方案3】:

你这样做的方式是让它等待。 不要忘记等待函数末尾的;

function snd() 
    var snd = new audio('yourFile.mp3');
    snd.play();
    wait(4000); //waits 4 seconds.

【讨论】:

【参考方案4】:

我想到了以下方法:启动一个计时器并等到声音播放结束。

Show dialog/dimmed overlay layer
setInterval()
    -> Compare snd->currentTime with snd.duration. If they are the same
        -> Clear interval
        -> Hide dialog/Show OK button

或者

Show dialog/dimmed overlay layer
setInterval()
    -> Is snd.ended ?
        -> Clear interval
        -> Hide dialog/Show OK button

【讨论】:

【参考方案5】:

有一个非常简单/简短的解决方案

使用以下代码语法-

Audio_object=document.getElementById('audio_tag_id');
if(Audio_object.currentTime==Audio_object.duration)
alert('completely played.');

audio_tag_id&lt;audio&gt; 元素的 id。

【讨论】:

感谢您的回答。不幸的是,我测试了但它没有工作。

以上是关于等到声音结束才能使用网页的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 等到 SlideUp() 结束

使用async await完成: 等到task线程内任务结束 交给主线程处理事情 task线程内不会出现卡死现象

我如何知道声音是不是在 android 中播放完毕?

我怎样才能让 2 个 wavefilereader 依次播放?

在 Xcode 中播放音效

如何在 SwiftUI 中等待音频完成?