检测全屏模式

IT技术 javascript jquery internet-explorer css
2021-03-02 14:23:26

IE 10 的现代桌面版本始终是全屏的。

W3 上有一个关于伪类活规范:fullscreen

但是当我尝试使用 jQuery 1.9.x 和 2.x 版检测全屏时:

$(document).is(":fullscreen") 

它抛出了这个错误:

语法错误,无法识别的表达式:全屏

问题:

  1. 是因为 jQuery 还不承认这个标准还是 IE10?

  2. 检查全屏模式传统方法是什么?我期待以下结果:

    function IsFullScreen() {
         /* Retrun TRUE */
         /* If UA exists in classic desktop and not in full screen  */
         /* Else return FALSE */
    }
    
  3. 我们可以在没有浏览器嗅探的情况下做到吗?

6个回答

正如您所发现的,浏览器兼容性是一个很大的缺点。毕竟,这是非常新的东西。

但是,由于您使用的是 JavaScript,因此与仅使用 CSS 相比,您有更多的选择。

例如:

if( window.innerHeight == screen.height) {
    // browser is fullscreen
}

您还可以检查一些稍微宽松的比较:

if( (screen.availHeight || screen.height-30) <= window.innerHeight) {
    // browser is almost certainly fullscreen
}
screen.height并且screen.availHeight不要使用多个显示器。至少在 IE 10 中,您始终可以获得主监视器的分辨率(可能不是显示浏览器窗口的那个),因此与它的比较window.innerHeight完全没有意义。window.screenTop == 0 && window.screenY == 0是 IE 10 的多显示器解决方案,但这不适用于其他浏览器。
2021-04-18 14:23:26
好吧,好吧,看来我发现了一个小问题.. 在 Chrome 中按 F12 并打开控制台,然后按 F11 并进入全屏模式,此代码将无法运行。有什么解决办法吗?
2021-04-19 14:23:26
对我来说,在全屏模式下 screen.height 等于 window.outerHeight,而不是innerHeight。
2021-04-21 14:23:26
感谢您的回答。它现在有效。希望浏览器供应商和 jQuery 人员会意识到 :fullscreen 伪类的重要性。
2021-05-05 14:23:26
将在双显示器设置中失败,尤其是当笔记本电脑连接到具有不同分辨率的辅助显示器时。
2021-05-10 14:23:26

当浏览器改变全屏模式时会触发一个事件。您可以使用它来设置变量值,您可以检查该值以确定浏览器是否全屏。

this.fullScreenMode = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen; // This will return true or false depending on if it's full screen or not.

$(document).on ('mozfullscreenchange webkitfullscreenchange fullscreenchange',function(){
       this.fullScreenMode = !this.fullScreenMode;

      //-Check for full screen mode and do something..
      simulateFullScreen();
 });





var simulateFullScreen = function() {
     if(this.fullScreenMode) {
            docElm = document.documentElement
            if (docElm.requestFullscreen) 
                docElm.requestFullscreen()
            else{
                if (docElm.mozRequestFullScreen) 
                   docElm.mozRequestFullScreen()
                else{
                   if (docElm.webkitRequestFullScreen)
                     docElm.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)
                }
            }
     }else{
             if (document.exitFullscreen) 
                  document.exitFullscreen()
             else{ 
                  if (document.mozCancelFullScreen) 
                     document.mozCancelFullScreen()
                  else{
                     if (document.webkitCancelFullScreen) 
                         document.webkitCancelFullScreen();
                  }
             }
     }

     this.fullScreenMode= !this.fullScreenMode

}
这没有正确检测它是否在 chrome mobile 上全屏显示..将其更改为: this.fullScreenMode = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen;
2021-05-01 14:23:26

这将适用于 IE9+ 和其他现代浏览器

function isFullscreen(){ return 1 >= outerHeight - innerHeight };

使用“1”(而不是零)是因为系统有时可能只保留一个像素高度用于鼠标与某些隐藏或滑动命令栏的交互,在这种情况下全屏检测将失败。

  • 适用于任何时候在全屏模式下运行的任何单独的文档元素

使用fullscreenchange事件来检测全屏更改事件,或者如果您不想处理供应商前缀,则也可以侦听该resize事件(进入或退出全屏时也会触发的窗口调整大小事件),然后检查是否document.fullscreenElement不为空以确定是否开启全屏模式。您需要相应地提供供应商前缀fullscreenElement我会使用这样的东西:

var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement ||
document.webkitFullscreenElement || document.msFullscreenElement;

https://msdn.microsoft.com/en-us/library/dn312066(v=vs.85).aspx有一个很好的例子,我在下面引用:

document.addEventListener("fullscreenChange", function () {
          if (fullscreenElement != null) {
              console.info("Went full screen");
          } else {
              console.info("Exited full screen");              
          }
      });
在 Chrome 上,当您按 F11 时,它不会出于某种原因触发 fullscreenchange 事件。但是,以全屏方式以编程方式设置它。更重要的是,事件本身并没有说明它是进入还是离开全屏。在 iOS 设备上,他们似乎也忽略了 touchmove 事件的阻止,这使用户能够将浏览器拖出全屏,只是为了增加头痛。
2021-04-22 14:23:26
您可能需要使用webkitfullscreenchangemozfullscreenchange但是,该事件仅在从 Fullscreen API 进入时触发。例如,如果您从 Chrome 的工具栏进入全屏模式,它就不会触发。
2021-05-11 14:23:26

阅读 MDN Web 文档,我喜欢这种原生方法。

https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/fullscreenElement

function is_fullscreen(){
    return document.fullscreenElement != null;
}

或发烧友

let is_fullscreen = () => !! document.fullscreenElement

当您在浏览器中打开开发人员工具时,此方法也适用。因为全屏应用于特定元素,所以 null 意味着它没有全屏显示。

您甚至可以扩展以检查特定元素,例如:

function is_fullscreen(element=null){
    return element != null? document.fullscreenElement == element:document.fullscreenElement != null;
}

如果当前是全屏并且(元素为空或元素是全屏元素),则仅返回true