227 votes

Lecture/pause d'une vidéo HTML 5 à l'aide de JQuery

J'essaie de contrôler des vidéos HTML5 à l'aide de JQuery. J'ai deux clips dans une interface à onglets, il y a six onglets au total, les autres ne contiennent que des images. J'essaie de faire en sorte que les clips vidéo soient lus lorsque l'on clique sur leur onglet et qu'ils s'arrêtent lorsque l'on clique sur l'un des autres.

Cela doit être simple à faire mais je n'arrive pas à le faire fonctionner. Le code que j'utilise pour lire la vidéo est le suivant :

$('#playMovie1').click(function(){
  $('#movie1').play();
      });

J'ai lu que l'élément vidéo doit être exposé dans une fonction pour pouvoir le contrôler, mais je n'ai pas trouvé d'exemple. Je suis capable de le faire fonctionner en utilisant JS :

document.getElementById('movie1').play();

Tout conseil serait le bienvenu. Merci

391voto

lonesomeday Points 95456

Votre solution montre le problème ici play n'est pas une fonction jQuery mais une fonction de l'élément DOM. Vous devez donc l'appeler sur l'élément DOM. Vous donnez un exemple de la façon de le faire avec les fonctions natives du DOM. L'équivalent jQuery - si vous vouliez faire cela pour vous intégrer à une sélection jQuery existante - serait le suivant $('#videoId').get(0).play() . ( get récupère l'élément DOM natif de la sélection jQuery).

7 votes

C'est génial, ça marche parfaitement, merci. C'est aussi une bonne chose de mieux comprendre le DOM.

1 votes

L'utilisation de JQuery pour contrôler la vidéo de cette manière semble causer des problèmes de lecture sur l'iPhone. L'élément vidéo se trouve dans un onglet, ce que JQuery révèle, mais un clic sur la flèche de démarrage de la vidéo ne fait pas démarrer le clip. Lorsque je supprime la ligne $('#videoId').get(0).play(), il n'y a aucun problème. Quelle est la meilleure façon de contourner ce problème ? Je pensais que je pourrais supprimer le js avec une déclaration conditionnelle pour iOS - la vidéo ne démarre pas automatiquement pour les appareils iOS de toute façon, donc je serais heureux de le faire - ou y a-t-il une solution plus simple ? Toute aide est la bienvenue.

0 votes

Comment puis-je faire cette pause todo les éléments <vidéo> sur une page ?

57voto

Miguel Tavares Points 86

Voici comment j'ai réussi à le faire fonctionner :

jQuery( document ).ready(function($) {
    $('.myHTMLvideo').click(function() {
        $(this).get(0).paused ? $(this).get(0).play() : $(this).get(0).pause();
    });
});

Toutes mes balises HTML5 ont la classe 'myHTMLvideo'.

7 votes

Notez qu'il n'y a pas besoin d'envelopper dans jQuery, vous pouvez donc économiser cette surcharge en remplaçant la ligne ternaire par celle-ci : this.paused ? this.play() : this.pause();

27voto

sudo work Points 398

Pourquoi devez-vous utiliser jQueury ? La solution que vous proposez fonctionne, et elle est probablement plus rapide que la contstruction d'un objet jQuery.

document.getElementById('videoId').play();

0 votes

Consultez la solution de lonesomeday si vous insistez sur une mise en œuvre de jQuery (vous y trouverez également une explication de la raison pour laquelle vous ne pouvez pas simplement appeler play sur un objet jQuery).

0 votes

Je pensais que j'utiliserais le code dans d'autres jQuery, et je le ferai probablement, mais en l'état actuel des choses, je n'utilise que cette ligne donc je suppose que cela aurait pu être fait avec le code que j'avais... aussi je n'étais pas sûr que ce soit une bonne pratique à mélanger. Merci pour le conseil en tout cas.

2 votes

Si vous avez déjà instancié un objet jQuery pour la fonction movie1 par le biais de $('movie1') pour d'autres actions jQuery, c'est parfait ; cependant, si vous ne le faites qu'à cet endroit, vous constaterez une certaine perte de performance. Ce n'est peut-être pas assez perceptible, mais j'aime bien optimiser.

22voto

Josh Holmes Points 21

Pour mettre en pause plusieurs vidéos, j'ai constaté que cela fonctionne très bien :

$("video").each(function(){
$(this).get(0).pause();
});

Cela peut être mis dans une fonction de clic, ce qui est assez pratique.

4 votes

Vous pouvez faire la même chose comme suit : $("video").each(function(){ this.pause() }) ;

1 votes

$(this) -> vous créez l'objet jquery à partir de l'objet "this". get(0) -> vous récupérez l'objet original "this" à partir de l'objet jquery... this === $(this).get(0)

15voto

dihejaso Points 143

En prolongement de la réponse de lonesomeday, vous pouvez également utiliser

$('#playMovie1').click(function(){
    $('#movie1')[0].play();
});

Remarquez qu'aucune fonction jQuery get() ou eq() n'est appelée. Le tableau du DOM est utilisé pour appeler la fonction play(). C'est un raccourci à garder à l'esprit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X