Şu anda bir <video> öğesinin oynatılıp oynatılmadığı nasıl anlaşılır?


85

Bunu görmek MediaElement arayüz içeren gibi niteliklerini paused, seekingve ended. Listede eksik olan, ancak playing.

Orada olduğunu biliyorum playingolaylar bir eleman yangın olduğunu başlar oynamaya ve timeupdateolaylar olaylar periyodik oynayan ederken, ancak bir video oynatılırken olmadığını belirlemek için bir yol arıyorum şimdi . Bunu belirlemenin kolay bir yolu var mı?

Elimdeki en yakın şey:

!(video.paused || video.ended || video.seeking || video.readyState < video.HAVE_FUTURE_DATA)

Yanıtlar:


89

Uzun zaman oldu ama işte harika bir ipucu. .playingTüm medya öğeleri için özel bir özellik olarak tanımlayabilir ve gerektiğinde buna erişebilirsiniz. İşte nasıl:

Object.defineProperty(HTMLMediaElement.prototype, 'playing', {
    get: function(){
        return !!(this.currentTime > 0 && !this.paused && !this.ended && this.readyState > 2);
    }
})

Şimdi bunu <video>veya bunun <audio>gibi öğelerde kullanabilirsiniz :

if(document.querySelector('video').playing){ // checks if element is playing right now
    // Do anything you want to
}

86

A'nın MediaElementşu anda oynayıp oynamadığını ortaya çıkaracak belirli bir özellik yoktur . Ancak, bunu diğer özniteliklerin durumundan çıkarabilirsiniz. Eğer:

  • currentTime sıfırdan büyüktür ve
  • paused yanlıştır ve
  • ended yanlış

öğe o anda oynatılıyor.

readyStateMedyanın hatalar nedeniyle durup durmadığını da kontrol etmeniz gerekebilir . Belki bunun gibi bir şey:

const isVideoPlaying = video => !!(video.currentTime > 0 && !video.paused && !video.ended && video.readyState > 2);

Bu varsayım, IE'de geçerli görünmüyor. Kullanıcı arama yaparken (ve bu nedenle video şu anda oynatılmıyorken), currentTime 0'dan büyük olabilir ve aynı anda paused = ended = false olabilir.
Bjarke

currentTime, video henüz oynatılmaya başlamamışsa, Safari'de kayan nokta olarak bana video süresini saniye cinsinden veriyor.
Q Caron

10
var video = $('selector').children('video');

var videoElement = video.get(0);

if (!videoElement.paused) {} 

Jquery kullanarak yapmanın bir yolu


Bu en iyi yol. Acc biri çok hantal
Bariq Dharmawan


1

Ben de aynı problemle karşı karşıyaydım. Çözüm çok basit ve anlaşılır:

// if video status is changed to "ended", then change control button to "Play Again"
video.onended = function() {
    $("#play_control_button").text("Play Again");
};

// if video status is changed to "paused", then change control button to "Continue Play"
video.onpause = function() {
    $("#play_control_button").text("Continue Play");
};

// if video status is changed to "playing", then change control button to "Stop"
video.onplaying = function() {
    $("#play_control_button").text("Stop");
};

Bu mülklerin belgelerine bağlantı verebilir misiniz?
brasofilo

@brasofilo Aşağıdaki bağlantının videoyu JavaScript ile kontrol etmek için yeterli bilgi sağlayacağını düşünüyorum: w3schools.com/tags/ref_av_dom.asp
Haolin Zhang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.