2012-05-28 3 views
4

J'essaie d'avoir une barre de progression de charge dans mon jeu, et j'ai une fonction assignée à l'attribut onloadeddata sur mon audio, mais elle ne se déclenche pas dans Chrome. Cela fonctionne dans d'autres navigateurs. J'ai également essayé de nombreux autres événements tels que oncanplay, oncanplaythrough, onloadedmetadata, etc. Aucun d'eux ne se déclenche.HTML5 Les événements audio ne se déclenchent pas sur Chrome

Je pense que cela pourrait avoir à voir avec la mise en cache. J'ai essayé de regarder autour et il y avait quelques rapports de cela il y a 2-3 ans mais rien de récent.

Existe-t-il un autre moyen de détecter si l'audio est chargé ou de faire fonctionner ces événements?

EDIT: Voici un exemple rapide: http://jsfiddle.net/3vxCu/1/ Fonctionne dans Opera et Firefox, mais pas dans Chrome. Il devrait donner une alerte quand le son est fini si le chargement est terminé.

+0

Pourriez-vous s'il vous plaît partager votre code javascript où vous chargez les fichiers audio et attacher les écouteurs d'événements? – pseudosavant

+0

@pseudosavant Ajout d'un exemple sur JSFiddle. –

Répondre

8

Il semble que la propriété onloadeddata ne fonctionne pas pour une raison quelconque. Mais la fixation d'un gestionnaire d'événements addEventListener (ou via jQuery) fonctionne: http://jsfiddle.net/3vxCu/4/

bgSound = new Audio(); 
bgSound.src = "http://www.ehsankia.com/hawkthorne/audio/level.ogg"; 
bgSound.preload = "auto"; 
// Standard browsers (not IE before version 9): 
// bgSound.addEventListener("loadeddata", testFunction, false); 

// jQuery: 
$(bgSound).on("loadeddata", testFunction); 

function testFunction() { 
    alert("Data loaded"); 
} 
+0

Étrange. Je ne suis pas professionnel mais me semble être un bug de Chrome. Quelqu'un devrait soumettre un ticket ou quelque chose. Le vôtre fonctionne bien, merci! –

+1

@EhsanKia Vous avez testé ce problème de la manière la plus complète, pourquoi n'écrivez-vous pas le rapport de bogue? :) http://code.google.com/p/chromium/issues/list – panzi

3

Si le jsfiddle joint est la façon dont vous avez implémenté votre code, alors je pense que je sais ce qui ne va pas.

Votre jsFiddle montre:

bgSound = document.createElement('audio'); 
bgSound.src = "http://www.ehsankia.com/hawkthorne/audio/level.ogg"; 
bgSound.onloadeddata = testFunction; 

function testFunction(){ 
    alert("Data loaded"); 
} 

Il devrait ressembler à ceci:

bgSound = document.createElement('audio'); 
bgSound.onloadeddata = testFunction; // Event listener is attached _before_ loading the resource 
bgSound.src = "http://www.ehsankia.com/hawkthorne/audio/level.ogg"; 

function testFunction(){ 
    alert("Data loaded"); 
} 

Fondamentalement, vous joignons l'écouteur d'événement après le src est spécifié. Spécifier la source devrait être la dernière chose que vous faites, car il met tout en mouvement. Chrome est probablement déjà passé le point d'appel des auditeurs pour cet événement au moment où il est joint à votre code.

+0

Je ne pense pas que ce soit le cas. Les données sont chargées de manière asynchrone et je pense que même si les données sont déjà mises en cache, les gestionnaires d'événements sont appelés de manière asynchrone (c'est-à-dire après la fin du JavaScript en cours d'exécution). Cependant, je pense que IE gère parfois de telles choses de manière synchrone (au moins, il appelait une fois un gestionnaire 'onhashchange' pour moi synchrone, alors que tous les autres navigateurs l'appellent de façon asynchrone). – panzi

+0

Je peux vous dire avec 100% de certitude que vous devriez * toujours * définir vos écouteurs d'événement avant de définir votre propriété 'src'. Vous supposez asynchrone signifie que les choses sont toujours hors séquence, mais ce n'est pas toujours le cas. La seule façon d'être sûr à 100% que votre écouteur d'événement est attaché avant que l'événement (s) obtiennent l'appel soit de les attacher avant de définir le 'src'. Chrome prend beaucoup de raccourcis/optimisations pour être rapide et il peut même ne pas essayer d'appeler des événements quand 'src' est défini si rien n'en écoute. – pseudosavant

Questions connexes