【问题标题】:Chrome returns undefined for cancelFullScreen AND webkitCancelFullScreenChrome 为 cancelFullScreen 和 webkitCancelFullScreen 返回 undefined
【发布时间】:2019-08-19 18:04:49
【问题描述】:

我编写了一个简单的函数来在 Web 应用程序上切换全屏模式。该应用程序只需要在 Chrome 中运行(最终部署在 Kiosk 模式下),但 cancelFullScreenwebkitCancelFullScreen 似乎有一些奇怪的行为。

例如,这里是精简的toggleFullScreen 函数:

var _isFullscreen = false;

function toggleFullScreen()
{
    var doc = document.documentElement,
        state = _inFullscreen,
        requestFunc = (doc.requestFullScreen || doc.webkitRequestFullScreen),
        cancelFunc = (doc.cancelFullScreen || doc.webkitCancelFullScreen);

    _inFullscreen = !(state);

    (!state) ? requestFunc.call(doc) : cancelFunc.call(doc);
}

由于某些奇怪的原因,Chrome 总是报告 cancelFuncundefined,即使 requestFunc 工作正常。

谁能解释这个原因,以及可能的解决方案(不需要 jQuery 或类似的库插件)?

【问题讨论】:

    标签: javascript google-chrome fullscreen


    【解决方案1】:

    在@Tom Chung 的帮助下,在玩了一圈之后,发现cancelFullScreen(同样webkitCancelFullScreen 需要在document 上调用,而requestFullscreen 需要在document.documentElement 上调用.

    因此,更新后的代码如下:

    function toggleFullScreen()
    {
     var doc = document.documentElement,
     state = (document.webkitIsFullScreen || document.isFullScreen),
     requestFunc = (doc.requestFullscreen || doc.webkitRequestFullScreen),
     cancelFunc = (document.cancelFullScreen || document.webkitCancelFullScreen);
    
     (!state) ? requestFunc.call(doc) : cancelFunc.call(document);
    }
    

    【讨论】:

    【解决方案2】:

    我是H5P 的开发人员之一,它支持所有支持它的浏览器的全屏。下面我复制了退出全屏所需的部分代码。

    首先我们需要弄清楚浏览器前缀

    var fullScreenBrowserPrefix;
    
    // Detect if we support fullscreen, and what prefix to use.
    if (document.documentElement.requestFullScreen) {
      /**
       * Browser prefix to use when entering fullscreen mode.
       * undefined means no fullscreen support.
       * @member {string}
       */
      fullScreenBrowserPrefix = '';
    }
    else if (document.documentElement.webkitRequestFullScreen) {
      var safariBrowser = navigator.userAgent.match(/Version\/(\d)/);
      safariBrowser = (safariBrowser === null ? 0 : parseInt(safariBrowser[1]));
    
      // Do not allow fullscreen for safari < 7.
      if (safariBrowser === 0 || safariBrowser > 6) {
        fullScreenBrowserPrefix = 'webkit';
      }
    }
    else if (document.documentElement.mozRequestFullScreen) {
      fullScreenBrowserPrefix = 'moz';
    }
    else if (document.documentElement.msRequestFullscreen) {
      fullScreenBrowserPrefix = 'ms';
    }
    

    下面是调用正确退出全屏功能的代码:

    if (fullScreenBrowserPrefix === '') {
      document.exitFullscreen();
    }
    else if (fullScreenBrowserPrefix === 'moz') {
      document.mozCancelFullScreen();
    }
    else {
      document[fullScreenBrowserPrefix + 'ExitFullscreen']();
    }
    

    代码复制自https://github.com/h5p/h5p-php-library/blob/master/js/h5p.js

    【讨论】:

      【解决方案3】:
      function toggleFullScreen()
      {
       //Post author DID NOT provide standards-compliant method at all.
       //Standards compliant approaches should detect first.
       //Prefixes are eventually removed / performance.
      
       if ()//standards here
       {
        //standards here
       }
       else if (document.documentElement.webkitRequestFullScreen)
       {
        document.documentElement.webkitRequestFullScreen();
       }
       else if (document.webkitCancelFullScreen)
       {
        document.webkitCancelFullScreen();
       }
      }
      

      不确定为什么 document.documentElement.webkitCancelFullScreen 未定义。

      也许(我猜)原因是全屏效果只能同时启动一次。

      但是,document.documentElement.webkitRequestFullScreen 是必需的,因为 document.documentElement 给出了要全屏显示的元素。

      http://jsfiddle.net/8mVBK/16/show/完美工作

      更新。

      http://jsfiddle.net/8mVBK/17/

      【讨论】:

      • 谢谢。不幸的是,这确实不是一个理想的解决方案,因为如果/当 Chrome 从 Fullscreen API 中删除 webkit 前缀时,它将需要一些维护。
      • 已进行修改。谢谢。
      • 谢谢。我查看了您修改后的解决方案,实际上找到了答案。 cancelFullScreen 需要在 document 上调用,而不是 document.documentElement!
      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2014-05-12
      • 2019-03-19
      • 1970-01-01
      • 2017-12-11
      • 2023-04-01
      • 2020-09-09
      相关资源
      最近更新 更多