How to detect if Chrome/Safari/Firefox prevented autoplay for video?

前端 未结 2 1383
说谎
说谎 2021-01-12 01:47

Background

Since Chrome version 66, videos that should autoplay on my site may be prevented from playing if the user haven\'t been on my site before.



        
2条回答
  •  庸人自扰
    2021-01-12 02:01

    For me best solution was:

    function _callback_onAutoplayBlocked() {
        // do something, for example "show big play button"
    }
    
    function isSafari() {
        var chr = window.navigator.userAgent.toLowerCase().indexOf("chrome") > -1;
        var sfri = window.navigator.userAgent.toLowerCase().indexOf("safari") > -1;
        return !chr && sfri;
    }
    
    function _checkAutoPlay(p) {
        var s = window['Promise'] ? window['Promise'].toString() : '';
    
        if (s.indexOf('function Promise()') !== -1 || s.indexOf('function ZoneAwarePromise()') !== -1) {
            p.catch(function(error) {
                console.error("_checkAutoPlay, error:", error)
                if(error.name == "NotAllowedError") { // For Chrome/Firefox
                    console.error("_checkAutoPlay: error.name:", "NotAllowedError")
                    _callback_onAutoplayBlocked();
                } else if (error.name == "AbortError" && isSafari()) {  // Only for Safari
                    console.error("_checkAutoPlay: AbortError (Safari)")
                    _callback_onAutoplayBlocked();
                } else {
                    console.error("_checkAutoPlay: happened something else ", error);
                    // throw error; // happened something else
                }
            }).then(function(){
                console.log("_checkAutoPlay: then");
                // Auto-play started
            });
        } else {
            console.error("_checkAutoplay: promise could not work in your browser ", p);
        }
    }
    
    var video1 = document.getElementById('video1');
    _checkAutoPlay(video1.play());
    

提交回复
热议问题