2012-01-05 2 views
0

HTML5 오디오 태그를 사용하여 오디오 파일을 차례로 재생하지만 루틴이 Firefox를 종료하는 것 같습니다. 그것은 alert()를 추가 할 때만 작동합니다.오디오 파일을 하나씩 재생

다른 응용 프로그램이 서버에 새 이벤트를 보낸 경우 매 2 초마다 검사하는 루틴이 있습니다. 그렇다면 새 이벤트의 이름을 화면에 씁니다. 이러한 이벤트 중 일부에는 관련 오디오 파일 (다른 소리 일 수 있음)이 있으므로 이벤트가 도착하면 오디오 파일을 재생해야합니다. 이벤트가 I이 함수를 호출 도착

:

나는이 루틴이 꺼내, (sound_name를);

function playSound(sound_name){ 
     if (!current_sound){ 
      current_sound = true; 
      $("#audio-player")[0].src = "../snd/"+sound_name; 
      //$("#audio-player")[0].load(); 
      $("#audio-player")[0].play(); 
     } 
     else { 
      //alert(sound_name); 
      playSound(sound_name); 
     } 
    } 

"current_sound"변수는 audio_player가 오디오 태그의 "ended"이벤트를 발생시킬 때 false로 설정됩니다. 이 이벤트에 함수를 첨부 했으므로 해고 될 때마다 변수 current_sound를 false로 설정합니다.

이 코드의 문제점은 playSound() 함수 내에서 해당 경고에서만 작동한다는 것입니다. 내가 파이어 폭스가 충돌하고 js 스크립트가 완료하는데 너무 오래 걸린다 고 말하기 시작하면 (그 중 하나는 js 스크립트가 아니라).

나는 많은 것을 수색했지만, 나는 어떤 파일이 미리 재생 될지 모른다는 이유로 내 사건에 유용하지 않은 주어진 파일 목록을 재생산하는 방법에 대한 예제를 발견했다.

제안 사항?

+0

이 질문의 전체 "오디오"요소 (및 HTML5 요소)를 추출하여 실제 Javascript 질문으로 만들 수 있습니다. –

답변

1

평범한 재귀 호출이 있습니다. alert은 지연을 추가하고 해당 실행 체인을 "중단"하여 스레드가 다른 곳에서 에지 웨이에서 단어를 얻을 수 있도록합니다. 아마도 다른 곳의 코드는 current_sound에서 false으로 설정되어있을 것입니다.

이와 같이 "대기"하는 대신 current_sound = false을 수행하는 모든 곳에서 — 콜백 함수를 사용하고 .play() 것을 수행하십시오.

0

첫 번째 호출 후 current_sound이 true로 설정됩니다. 이렇게하면 함수를 다시 호출 할 때마다 분기 분기가 수행됩니다. 무한 재귀가 발생합니다.

+0

궤도의 @ Lightness Races 감사합니다. currentSound를 false로 설정하는 함수 내에서 playSound() 함수 내부에서 수행해야하는 작업을 이해합니다 ("종료 된"이벤트가 발생하면 콜백 함수 임). 하지만 사운드가 재생되기를 기다리는 5 가지 이벤트가 있다면 어떻게됩니까? 콜백 함수에 다음 소리가 어떻게 전달되는지 이해하지 못하는 부분입니다. – user1132585

+0

@ user1132585 :'$ ("# audio-player") [0]'다음입니다. –