Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

124
Visualizações
Ajax HTML5 Audio Player no puede cargar la siguiente pista después de que se reproduce la segunda pista

Esta es una pregunta de seguimiento a esta publicación...

Cargue automáticamente una nueva canción en el reproductor de audio HTML 5 cuando finalice la pista usando php/jquery

Gracias a las contribuciones de @Roko C. Buljan, pude usar el siguiente script para cargar una nueva pista en div#player. Cuando finaliza la pista, simulé un clic usando la función ajax loadurl que luego carga una nueva pista en div#player. Esto funciona bien y se supone que carga una nueva pista cuando finaliza y sigue y sigue, pero no funciona.

 <script type="text/javascript"> const audio = document.querySelector('#myAudio'); audio.addEventListener("ended", () => { loadurl.call(this,'player.php?random=1','player'); }); </script>

Creo que addEventListener no puede reconocer el archivo player.php que se está cargando a través de ajax.

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Mirando el código que estabas usando, puedo ver muchos errores:

  • la etiqueta <source> debe cerrarse automáticamente;
  • la etiqueta <source> debe ser un elemento secundario de la etiqueta <audio>
  • la etiqueta <audio> no debe tener el atributo de loop , o el evento ended nunca se llama; tienes que eliminar este atributo incluso del script player.php.

Creo que ya ha eliminado el atributo de loop del código real; de lo contrario, no funcionará ni siquiera la primera vez.

Ahora, el problema ocurre debido a esta línea:

 document.getElementById(targetID).innerHTML = XMLHttpRequestObject.responseText;

porque está eliminando el objeto de audio actual y reemplazándolo por uno nuevo. Cuando la pista finaliza, genera el evento ended en el nuevo objeto de audio, que no tiene un controlador de eventos adjunto. El controlador de eventos que definió anteriormente ya no se llamará.

La forma correcta de hacer las cosas es no reemplazar el objeto de audio, sino simplemente reemplazar su atributo src con el nuevo nombre de la pista.

Editar

Entonces, podría cambiar su player.php para devolver el nombre del archivo y otros datos sin las etiquetas html, por ejemplo, en formato json:

 $track = array('file'=>$file, 'image'=>$image); echo json_encode($track);

y reemplace la línea anterior con:

 var track = JSON.parse(XMLHttpRequestObject.responseText); audio.src = track.file; document.querySelector('#image').src = track.image; document.querySelector('#download').href = track.file;

donde image y download son los ID de los elementos <img/> y <a>download</a> .

Otra opción es volver a vincular el evento ended cada vez que reemplaza el html, pero desaconsejo encarecidamente este enfoque. De todos modos, si eliges seguir este camino, debes hacerlo de esta manera:

 function loadurl(dest, targetID) { ... document.getElementById(targetID).innerHTML = XMLHttpRequestObject.responseText; var audio = document.querySelector('#myAudio'); audio.addEventListener("ended", () => { loadurl.call(this,'player.php?random=1','player'); }); ... } var audio = document.querySelector('#myAudio'); audio.addEventListener("ended", () => { loadurl.call(this,'player.php?random=1','player'); });

Tenga en cuenta que el símbolo de audio debe ser variable, no constante; de lo contrario, no puede reemplazar su valor con el nuevo elemento de audio.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda