【问题标题】:Play an audio file using jQuery when a button is clicked单击按钮时使用 jQuery 播放音频文件
【发布时间】:2011-12-13 13:02:35
【问题描述】:

当我单击按钮时,我试图播放音频文件,但它不起作用,我的 html 代码是:

<html>    
    <body>
        <div id="container">
            <button id="play">
                Play Music
            </button>
        </div>
    </body>
</html>

我的 JavaScript 是:

$('document').ready(function () {
    $('#play').click(function () {
        var audio = {};
        audio["walk"] = new Audio();
        audio["walk"].src = "http://www.rangde.org/static/bell-ring-01.mp3"
        audio["walk"].addEventListener('load', function () {
            audio["walk"].play();
        });
    });
});   

我也为此创建了一个Fiddle。

【问题讨论】:

  • 你使用的是HTML5的audio

标签: javascript jquery html


【解决方案1】:

哪种方法?

您可以使用&lt;audio&gt; 标签或&lt;object&gt; 或&lt;embed&gt; 播放音频。 延迟加载(在需要时加载)如果声音很小,声音是最好的方法。您可以动态创建音频元素,加载后您可以使用.play() 启动它并使用.pause() 暂停它。

我们使用的东西

我们将使用canplay 事件来检测我们的文件是否可以播放。

音频元素没有.stop() 函数。我们只能暂停它们。当我们想从音频文件的开头开始时,我们更改它的.currentTime。我们将在示例audioElement.currentTime = 0; 中使用这一行。为了实现.stop()功能,我们首先暂停文件然后重置它的时间。

我们可能想知道音频文件的长度和当前的播放时间。我们已经在上面学习了.currentTime,要了解它的长度,我们使用.duration。

示例指南

  1. 文档准备就绪后,我们动态创建了一个音频元素
  2. 我们将其来源设置为我们要播放的音频。
  3. 我们使用“结束”事件重新启动文件。

当 currentTime 等于它的持续时间时,音频文件将停止 玩。每当您使用play() 时,它都会从头开始。

  1. 每当音频.currentTime 发生变化时,我们都会使用timeupdate 事件来更新当前时间。
  2. 我们使用canplay 事件在文件准备好播放时更新信息。
  3. 我们创建了播放、暂停、重启的按钮。

$(document).ready(function() {
    var audioElement = document.createElement('audio');
    audioElement.setAttribute('src', 'http://www.soundjay.com/misc/sounds/bell-ringing-01.mp3');
    
    audioElement.addEventListener('ended', function() {
        this.play();
    }, false);
    
    audioElement.addEventListener("canplay",function(){
        $("#length").text("Duration:" + audioElement.duration + " seconds");
        $("#source").text("Source:" + audioElement.src);
        $("#status").text("Status: Ready to play").css("color","green");
    });
    
    audioElement.addEventListener("timeupdate",function(){
        $("#currentTime").text("Current second:" + audioElement.currentTime);
    });
    
    $('#play').click(function() {
        audioElement.play();
        $("#status").text("Status: Playing");
    });
    
    $('#pause').click(function() {
        audioElement.pause();
        $("#status").text("Status: Paused");
    });
    
    $('#restart').click(function() {
        audioElement.currentTime = 0;
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
    <h2>Sound Information</h2>
    <div id="length">Duration:</div>
    <div id="source">Source:</div>
    <div id="status" style="color:red;">Status: Loading</div>
    <hr>
    <h2>Control Buttons</h2>
    <button id="play">Play</button>
    <button id="pause">Pause</button>
    <button id="restart">Restart</button>
    <hr>
    <h2>Playing Information</h2>
    <div id="currentTime">0</div>
</body>

【讨论】:

  • 而且你必须把这个脚本放到*的末尾
  • here 是一个主要适用于所有浏览器的标记。
  • 非常好,尽管 OP 明确表示他想在 jQuery 中执行此操作。在您的示例中,您使用纯 javascript 进行 dom 操作和事件侦听器。
  • 我对这个 sn-p 有疑问:如何在 mp3 结束时自动停止音频?现在,我的音频很短,这会继续循环播放
  • @DomenicoMonaco 只需删除从头开始播放音频的ended 事件。
【解决方案2】:
$("#myAudioElement")[0].play();

它不适用于您所期望的$("#myAudioElement").play()。官方的原因是,将其合并到 jQuery 中会为每个元素添加一个play() 方法,这会导致不必要的开销。因此,您必须通过它在您使用$("#myAudioElement") 检索的 DOM 元素数组中的位置来引用它,也就是 0。

此引用来自bug that was submitted about it,已关闭为“feature/wontfix”:

为此,我们需要为每个 DOM 元素方法名称添加一个 jQuery 方法名称。当然,该方法对非媒体元素没有任何作用,因此它似乎不值得花费额外的字节。

【讨论】:

  • 谢谢!正是我想要的!
【解决方案3】:

对于其他跟随的人,我只是接受了 Ahmet 的回答并更新了原始提问者的 jsfiddle here,替换为:

audio.mp3

为

http://www.uscis.gov/files/nativedocuments/Track%2093.mp3

在网上免费提供 mp3 中的链接。感谢您分享简单的解决方案!

【讨论】:

  • 适用于 Ubuntu 上的 Firefox 42
  • Chrome 的这个 jsfiiddle 中不会触发 load 事件。它只是因为自动播放属性而播放。
【解决方案4】:

我在这里有一个很好的通用解决方案,带有后备:

<script type="text/javascript">
    var audiotypes={
        "mp3": "audio/mpeg",
        "mp4": "audio/mp4",
        "ogg": "audio/ogg",
        "wav": "audio/wav"
    }

    function ss_soundbits(sound){
        var audio_element = document.createElement('audio')
        if (audio_element.canPlayType){
            for (var i=0; i<arguments.length; i++){
                var source_element = document.createElement('source')
                source_element.setAttribute('src', arguments[i])
                if (arguments[i].match(/\.(\w+)$/i))
                    source_element.setAttribute('type', audiotypes[RegExp.$1])
                audio_element.appendChild(source_element)
            }
            audio_element.load()
            audio_element.playclip=function(){
                audio_element.pause()
                audio_element.currentTime=0
                audio_element.play()
            }
            return audio_element
        }
    }
</script>

之后,您可以根据需要初始化任意数量的音频:

<script type="text/javascript" >
    var clicksound  = ss_soundbits('your/path/to/click.ogg', "your/path/to/click.mp3");
    var plopsound  = ss_soundbits('your/path/to/plopp.ogg', "your/path/to/plopp.mp3");
</script>

现在您可以通过简单的事件调用(例如

)在任意位置访问已初始化的音频元素
onclick="clicksound.playclip()"

onmouseover="plopsound.playclip()"

【讨论】:

    【解决方案5】:

    怎么样:

    $('#play').click(function() {
      const audio = new Audio("https://freesound.org/data/previews/501/501690_1661766-lq.mp3");
      audio.play();
    });
    

    【讨论】:

    • 这是最简单的方法,就像一个魅力,如果你愿意,你可以使用 vanilla js 事件来触发同样的动作。
    【解决方案6】:

    JSFiddle Demonstration

    这是我在 jQuery 中使用的:

    $('.button').on('click', function () { 
        var obj = document.createElement('audio');
        obj.src = 'linktoyourfile.wav'; 
        obj.play(); 
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多