버튼 클릭시 jQuery를 사용하여 오디오 파일 재생


93

버튼을 클릭 할 때 오디오 파일을 재생하려고하는데 작동하지 않습니다. 내 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의 오디오 를 사용
OnesimusUnbound

답변:


145

어떤 접근법?

당신은 오디오를 재생할 수 있습니다 <audio>태그 또는 <object><embed>. Lazy loading (필요할 때로드) 크기가 작은 경우 사운드가 가장 좋은 방법입니다. 오디오 요소를 동적으로 만들 수 있으며로드되면로 시작하고로 .play()일시 중지 할 수 있습니다 .pause().

우리가 사용한 것들

canplay이벤트를 사용 하여 파일을 재생할 준비가되었는지 확인합니다.

.stop()오디오 요소에 대한 기능 이 없습니다 . 일시 중지 만 할 수 있습니다. 그리고 오디오 파일의 처음부터 시작하려면 .currentTime. 이 행을 예제에서 사용합니다 audioElement.currentTime = 0;. .stop()기능 을 얻기 위해 먼저 파일을 일시 중지 한 다음 시간을 재설정합니다.

오디오 파일의 길이와 현재 재생 시간을 알고 싶을 수 있습니다. 우리 .currentTime가 사용하는 길이를 배우기 위해 위에서 이미 배웠습니다 .duration.

예제 가이드

  1. 문서가 준비되면 오디오 요소를 동적으로 만들었습니다.
  2. 재생하려는 오디오로 소스를 설정합니다.
  3. 파일을 다시 시작하기 위해 '종료'이벤트를 사용했습니다.

currentTime이 지속 시간과 같으면 오디오 파일 재생이 중지됩니다. 를 사용할 때마다 play()처음부터 시작됩니다.

  1. timeupdate오디오가 .currentTime변경 될 때마다 현재 시간을 업데이트하기 위해 이벤트를 사용 했습니다 .
  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>


1
그리고 당신은 * <몸>의 끝에이 스크립트를 삽입해야합니다
tbleckert

여기대부분 모든 브라우저에서 작동 하는 마크 업이 있습니다.
shaijut

OP가 jQuery에서 이것을하고 싶다고 명시 적으로 말했지만 매우 좋습니다. 귀하의 예에서는 DOM 조작 및 이벤트 리스너에 순수한 자바 스크립트를 사용하고 있습니다.
Jacques

이 스 니펫에 문제가 있습니다. mp3가 종료되면 어떻게 자동으로 오디오를 중지 할 수 있습니까? 지금, 내 매우 짧은 오디오,이 루프에서 계속 소리
도메니코 모나코

1
@DomenicoMonaco ended처음부터 오디오를 재생하는 이벤트를 제거하십시오 .
Ahmet Can Güven

45
$("#myAudioElement")[0].play();

$("#myAudioElement").play()예상대로 작동하지 않습니다 . 공식적인 이유는 jQuery에 통합하면 play()모든 단일 요소에 메서드 가 추가되어 불필요한 오버 헤드가 발생하기 때문입니다. 따라서 대신 검색하는 DOM 요소 배열의 위치 ( $("#myAudioElement")일명 0)로 참조해야합니다.

이 인용문은 "feature / wontfix"로 종료 된 버그에 대해 제출 된 것입니다 .

이를 위해 각 DOM 요소 메서드 이름에 대해 jQuery 메서드 이름을 추가해야합니다. 그리고 물론 그 방법은 미디어가 아닌 요소에 대해 아무것도하지 않으므로 추가 바이트를 사용할 가치가없는 것 같습니다.


3
감사합니다! 내가 찾던 바로 그것!
utdrmac

21

다른 사람을 위해 Ahmet의 답변을 취하고 여기 에서 원래 askerjsfiddle을 업데이트했습니다 .

audio.mp3

...에 대한

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

웹에서 자유롭게 사용할 수있는 mp3로 연결. 쉬운 솔루션을 공유해 주셔서 감사합니다!


Ubuntu의 Firefox 42에서 작동
Bojan Kogoj

1
Chrome의이 jsfiiddle에서로드 이벤트가 발생하지 않습니다. autoplay 속성 때문에 재생됩니다.

12

여기에는 대체 기능이있는 멋지고 다양한 솔루션이 있습니다.

<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()"

4

JSFiddle 데모

이것은 내가 JQuery와 함께 사용하는 것입니다.

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

4

이건 어떤가요:

$('#play').click(function() {
  const audio = new Audio("https://freesound.org/data/previews/501/501690_1661766-lq.mp3");
  audio.play();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


그것은 가장 간단한 방법이고, 매력처럼 작동하며, 원한다면 바닐라 js 이벤트를 사용하여 동일한 액션을 실행할 수 있습니다.
Andrea Mauro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.