【问题标题】:How to detect if user has enabled full screen in browser如何检测用户是否在浏览器中启用全屏
【发布时间】:2023-03-17 22:09:01
【问题描述】:

当用户在 Chrome 或 FireFox 中启用全屏时,是否会触发一些 JavaScript 事件?

我的 WebGL 应用程序的画布宽度和高度设置为特定大小,我想在用户启用全屏时调整其大小。如果没有这样的事件,我是否应该开始研究用画布填充浏览器窗口的方法,尽管它在调试时会使事情变得复杂?

【问题讨论】:

    标签: javascript google-chrome firefox webgl dom-events


    【解决方案1】:

    在 2019 年,也就是问题提出八年后,MDN recommends 使用 fscreen,因为浏览器仍然不以一致的方式支持全屏 API。

    要检测浏览器是否已全屏,请监听事件fullscreenshange

    fscreen.addEventListener('fullscreenchange', handler, options);
    

    要获取当前全屏的元素,请使用fscreen.fullscreenElement

    demo of fscreen表示可以检测到全屏状态。

    【讨论】:

      【解决方案2】:

      经过多次搜索和挫折,这是我发现的最好方法:

      function isFullScreen() {
          // do stuff for full screen
      }
      
      function notFullScreen() {
          // do stuff for non-full screen
      }
      document.addEventListener("fullscreenchange", function () {
          (document.fullscreen) ? isFullScreen() : notFullScreen();
      }, false);
      
      document.addEventListener("mozfullscreenchange", function () {
          (document.mozFullScreen) ? isFullScreen() : notFullScreen();
      }, false);
      
      document.addEventListener("webkitfullscreenchange", function () {
          (document.webkitIsFullScreen) ? isFullScreen() : notFullScreen();
      }, false);
      

      或者如果您不想使用三元运算符:

      function isFullScreen() {
          // do stuff for full screen
      }
      
      function notFullScreen() {
          // do stuff for non-full screen
      }
      document.addEventListener("fullscreenchange", function () {
          if (document.fullscreen) {
              isFullScreen();
          } else {
              notFullScreen();
          }
      }, false);
      
      document.addEventListener("mozfullscreenchange", function () {
          if (document.mozFullScreen) {
              isFullScreen();
          } else {
              notFullScreen();
          }
      }, false);
      
      document.addEventListener("webkitfullscreenchange", function () {
          if (document.webkitIsFullScreen) {
              isFullScreen();
          } else {
              notFullScreen();
          }
      }, false);
      

      【讨论】:

      • 如果用户进入全屏模式然后加载页面,这是否有效?或者如果他们重新加载当前页面?
      • @skibulk 不确定,在我的用例中,重新加载页面会自动使我退出全屏模式,但我将其应用于视频播放器。
      【解决方案3】:

      您可以将屏幕宽度与浏览器宽度或高度进行比较。

      if (screen.width == window.innerWidth && screen.height == window.innerHeight) {
          //full web browser
      }
      

      编辑:如果用户有下载管理器、翻译栏或元素检查器打开高度与屏幕不同,请在 chrome 中小心。

      【讨论】:

      • 这可行,但需要不断检查某些区间函数的变化,这与事件处理相比不太可取。
      • 我制作了这个脚本来查看移动设备的尺寸。检查onresize 事件,首先检查onloadfrommelt.fr/dimension.html
      • 但是如果用户有下载管理器,在chrome中要小心,翻译栏或元素检查器打开高度与屏幕不同。
      【解决方案4】:

      我创建一个新事件,当浏览器进入全屏并返回(通过 F11 或 HTML5 Fullscreen API)时触发。

      (function(){
          var ok = true;
          window.addEventListener('resize', function()
          {
              setTimeout(function () 
              {
                  if (ok)
                  {
                      ok = false;
                      setTimeout(function () { ok = true; }, 170);
                      sendEvent(window.outerWidth === screen.width && window.outerHeight === screen.height);
                  }
              }, 30);
          }, false);
      
          function sendEvent(fullscreen)
          {
              var event = new CustomEvent('fullscreenchange', { detail: fullscreen, bubbles: true, cancelable: true });
      
              if (document.fullscreenElement)
                  document.fullscreenElement.dispatchEvent(event);
              else
                 document.dispatchEvent(event);  
          }
      })();
      

      与 JavaScript 一起使用

      document.addEventListener('fullscreenchange', fullscreenChanged, false);
      
      function fullscreenChanged(event)
      {
          console.log('Fullscreen: ' + event.detail);
      }
      

      或 jQuery

      $(document).on('fullscreenchange', function()
      {
          console.log('Fullscreen: ' + event.detail);
      });
      

      【讨论】:

        【解决方案5】:

        我已经在不同的浏览器(IE9、Chrome、FireFox、Opera & Safari)上做了测试,这个功能可以工作。

        function chkfullscreen() {
            if (window.navigator.standalone || (document.fullScreenElement && document.fullScreenElement != =null) || (document.mozFullScreen || document.webkitIsFullScreen) || (!window.screenTop && !window.screenY))
                // full screen
                alert('full screen');
        }
        

        【讨论】:

        • if (!window.screenTop && !window.screenY) 在某些情况下不起作用(例如,如果浏览器窗口没有边框并且用户将窗口最大化)。除了在多个浏览器上进行测试之外,您还必须在多个操作系统和窗口管理器上进行测试。
        • 感谢您指出情况。我建议试试这个全屏测试网站pearce.org.nz/fullscreen
        【解决方案6】:

        您可以使用 document.mozFullScreen 和 document.webkitIsFullScreen 如下:

        if ((!document.mozFullScreen && !document.webkitIsFullScreen)) {
           //FullScreen is disabled
        } else {
           //FullScreen is enabled
        }
        

        【讨论】:

        • 当我实际上处于全屏状态时,我得到了一个错误。 OS X 上的 Chrome。
        • @tremby 你是在浏览器的帮助下进入全屏还是使用了javascript requestFullscreen api?因为此标志仅用于检测元素是否已进入全屏模式而不是窗口本身
        • 可能就是这样。但我不知道两年前我在做什么,所以没办法说。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 2016-03-29
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多