Le canplay/canplaythrough événements pour une vidéo HTML5 ne sont pas appelés sur Firefox. Pourquoi?
Je suis en train de construire un plugin jQuery pour gérer les vidéos HTML5. Je suis en train d'essayer de capturer le canplay et canplaythrough événements. Dans Chrome, l'événement est déclenché sans problème. Dans Firefox, parfois, il est déclenché, parfois il ne l'est pas.
Je vais simplifier mon code un peu ici:
$('#my_video').on('canplay canplaythrough', function(){
console.log('canplay event fired');
});
J'ai aussi essayé avec du javascript natif .la méthode addEventListener() et ça ne fonctionne pas.
Aucune idée pourquoi l'événement n'est pas appelé sur Firefox et comment le corriger?
NOTE: s'il vous Plaît ne me dites pas d'utiliser l'un de la déjà disponibles plugins comme jplayer et vidéo-js, je sais qu'ils existent et fonctionnent bien, mais je dois construire une solution en interne.
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que votre
video
élément a déclenché lacanplaythrough
événement avant de vous enregistré le gestionnaire d'événement.Comme vous l'avez souligné dans votre réponse, vous pouvez mettre vos scripts dans le
<head>
, mais cela est mauvais pour votre performance.Une meilleure façon de résoudre le problème est de vérifier la
readystate
attribut et l'exécution de votre fonction manuellement dans ce cas:4
ou plus.defer
attribut, garder les scripts dans la tête et j'ai toujours le même niveau de performance.<script>
tag de la<head>
avec undefer
résultat sera le même problème que @Gabriel a été décrit.body
élément est une mauvaise pratique et même d'envisager de déplacer les scripts entre lesbody
ethead
élément est clair depuis des amateurs de compréhension au niveau de JavaScript.La raison la plus probable que vous avez vu ce qui a probablement à voir avec les problèmes de synchronisation. Vous avez dit dans votre réponse que la mise en jQuery dans la tête plutôt que le pied de page permet de résoudre le problème. Cela me dit que le problème est DOM l'analyse et l'exécution de script de commande. Le plus probable est que le "en jeu" et "canplaythrough" les événements ont été déclenchés avant de jquery et de votre page de script ont été analysées et les gestionnaires d'événements ajoutée, mais seulement parfois, en fonction du trafic sur le réseau et les temps de chargement. En mettant le script dans la tête, vous en avez forcé votre événement contraignant à se produire avant que les éléments du DOM ont été créés, de sorte que vous ne manquez pas tous les événements.
Que d'un côté, les avantages de performance de mettre des éléments de script en bas de la page sont discutables. Si vraiment vous souhaitez modifier les performances de page, utilisez quelque chose comme LABjs à gérer en parallèle script de chargement.
Même si ma question n'est pas d'obtenir toute l'attention que ce soit, je pense que c'est une bonne idée de donner une explication pour les personnes qui pourraient tomber sur ce dans l'avenir...
Le problème est vraiment bizarre: si la base jQuery est inclus dans le pied de page, certaines vidéos ne fonctionnent pas. Si la base jQuery est inclus dans l'en-tête du document, tous les événements sont appelés correctement.
Donc la solution est d'inclure jQuery de base dans le code html de la tête, même si les "meilleures pratiques" pour l'optimisation, il est recommandé de placer tous les script à la fin du corps pour accélérer les temps de chargement.
canplay
etcanplaythrough
événements déclenchés avant jQuery attache les écouteurs d'événement. EDIT: Viens de remarquer que Clayton Gulick discuté de la question ci-dessous.Je crois aussi que c'est une condition de course. La façon dont je suis autour d'elle est comme suit:
Dans le code HTML de l'élément vidéo ajouter l'attribut preload="métadonnées" - juste pour charger les métadonnées de la vidéo. Donc:
Prochain, à l'intérieur de la JS:
Cette ouvert le message pour moi en Chrome n'ai pas testé ailleurs.
Si vous pensez que le Firefox pour charger l'audio après avoir déclencher
load
alors il ne serait pas le faire. Il fera feu de l'loadstart
mais ne permettra pas de télécharger quoi que ce soit. Pas deprogress
événements seront tirées. Et il sera effectivement ne pas faire de demande pour ce fichier. Vous pouvez voir ce comportement dans Firebug.Firefox ne démarre le chargement du fichier après le déclenchement d' "jouer".
La preuve. Voir la sortie de la console.
preload
n'a rien à voir avecaudio.load()
. Au lieu de cela, il modifie le comportement du navigateur lorsque aucune action n'est effectuée avec l'audio. Si je me trompe merci de me pointer à la documentation. Est-il possible de forcer l'audio de ne PAS charger lors du chargement de la page et au lieu de charger complètement quandload()
est déclenchée?preload
attr. Certains navigateurs précontrainte audio/vidéo en tout cas à paraître rapide.Dans mon cas, cela a été déterminé par la
preload
de l'attribut spécifié pour l'élément. Je ne l'avais pas spécifié, alors les différents navigateurs ont choisi de faire des choses différentes.Une fois que j'ai précisé
preload="auto"
, leon("canplay")
gestionnaire d'événement a bien fonctionné/comme prévu.Ajoutant:
Après l'ajout de la canplaythrough écouteur d'événement, il fixe pour moi sur Firefox et Safari.
Après 1,5 jours de tenter des approches différentes à partir d'ici (à la vanille). Les événements "en jeu" et "canplaythrough" avec addEventListner ne travaillent en Bord. Qu'ils fonctionnent très bien dans tous les autres Navigateur. Je me suis donc retrouvé avec un chèque de "bon état" avec setTimout :-(. Pas très élégant, mais ça fonctionne pour moi.
}