【问题标题】:Fullscreen API not working if triggered with F11如果使用 F11 触发,全屏 API 将不起作用
【发布时间】:2020-09-16 00:17:23
【问题描述】:

我为我的应用程序实现了一个全屏切换功能,它实际上运行良好,在最新的 Chrome、Firefox、IE 和 Opera 上进行了测试。我有一种激活方法和一种停用全屏模式的方法:

  public deactivateFullscreen(element) {
    if (element.requestFullscreen) {
      element.requestFullscreen();
    } else if (element.webkitRequestFullscreen) {
      document.webkitCancelFullScreen();
    } else if (element.mozRequestFullScreen) {
      document.mozCancelFullScreen();
    }else if(element.msRequestFullscreen){
      document.msExitFullscreen();
    }
  }

  public activateFullscreen(element) {
    if (element.requestFullScreen) {
      element.requestFullScreen();
    } else if (element.webkitRequestFullScreen) {
      element.webkitRequestFullScreen();
    } else if (element.mozRequestFullScreen) {
      element.mozRequestFullScreen();
    }else if(element.msRequestFullscreen){
      element.msRequestFullscreen();
    }
  }

因此,当从 UI 触发时,它们都可以正常工作。唯一的问题是,一旦我使用F11 进入全屏模式,我就无法使用deactivateFullscreen 函数退出它。据我了解,一旦我点击F11,浏览器就不会设置任何标志。我尝试使用以下方法对其进行测试:

  public isFullscreen(element) {
    if(element.webkitIsFullScreen || element.mozFullscreen || element.msFullscreenElement || element.fullscreenElement || element.fullscreen || element.webkitFullscreenElement || element.mozFullScreenElement){
      return true;
    }
    return false;
  }

无论我是否全屏,这总是返回 false。有没有其他方法可以检测我的浏览器当前是否处于全屏模式?还是我在这里遗漏了一些概念?

我尝试的另一件事是捕获 F11 的 keydown 事件并阻止其默认操作。

$document.on('keydown',this.fsHandle);

  public fsHandle(event:KeyboardEvent){
    if(event.keyCode == 122){
      event.preventDefault();
      this._isFullscreen = !this._isFullscreen;
    }
  }

使用此方法,我希望抑制任何 F11 事件,以便通过代码手动处理全屏切换。不幸的是,这也不起作用。原因似乎有点奇怪,当我已经处于全屏状态时,根本不会触发 keydown 事件。因此,我可以在全屏模式之外抑制事件,但一旦我进入它就不能。

更新: 一些研究表明,浏览器供应商的安全问题是这种行为的原因。仍然必须有一种方法来处理这种特性。

【问题讨论】:

  • 我觉得这个post会对你有帮助

标签: jquery html typescript html5-fullscreen


【解决方案1】:

目前看来不可能。

请参阅this question,这是在问完全相同的事情。 但这是一个不断变化的情况,值得不时重新审视,所以这里是我收集的一些细节。

那里有一条评论说:

这种全屏窗口模式依赖于操作系统,仅在应用程序级别,与我们可怜的网络开发人员可用的任何 API 无关。 [...] 你不会发现任何跨浏览器/跨操作系统的黑客(我什至不知道我自己的浏览器/操作系统)。获得某些东西的唯一方法是通过 [a] 更强大的 API,让您的应用程序可以访问浏览器的窗口。

允许以编程方式控制全屏状态的 API 在 fullscreen spec 中定义,我希望它能阐明这个问题。浏览器还没有完全实现它(例如,document.exitFullscreen() 没有在 Chrome 中实现,document.webkitExitFullscreen() 没有返回Promise),但它给出了关于事情进展的提示。不幸的是,它没有提到预先存在的全屏浏览器功能(由 F11 触发的功能),因此很难说这将如何发展。

目前,F11-fullscreen 和 programmatic-fullscreen 是两种不同的东西,尽管它们并不完全相互隔离。此外,例如在 macOS 上,浏览器的“全屏”功能完全不同,因为它确实占据了整个屏幕,但仍然可以显示地址栏和/或选项卡。

如果您检查 this demo page 以获取包装特定于浏览器的实现的库,您可以看到:

  • 当以编程方式设置正文或任何元素全屏时,浏览器会应用special CSS rules(例如背景变为黑色)。
  • F11-fullscreen 不会发生这种情况
  • 在文档 (document.documentElement) 上编程全屏时也不会发生这种情况,因此这是您可以从 F11-fullscreen 获得的最接近的结果。

但这并不能使 F11-FS 和 programmatic-FS-on-doc-element 等效:

  • 动画过渡是不同的(实际上有点笨拙,例如在 Firefox 上和在文档元素上的程序化全屏,因为它在预期黑色背景时淡入黑色,但是当全屏元素是文档时没有黑色背景,如所述以上)
  • 当 F11-fullscreened 时,document.documentElement === (document.msFullscreenElement || document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement) 为 false,但在 programmatic-fullscreen-on-document-element 时为 true(在 Chrome、Firefox 和 IE11 上验证)
  • F11键可以退出programmatic-fullscreen,但是programmatic-exitFullscreen不能退出F11-fullscreen。这是您遇到的问题。此外,Esc 键无法退出 F11-全屏,但可以退出 programmatic-全屏。

那么,我们应该怎么做呢?

由于有 2 个不同的功能,也许可以保留它们:如果用户输入 F11-全屏,他们将知道如何通过再次按下相同的键来退出。如果他们使用您的 UI 控件进入 programmatic-fullscreen,请确保您清楚地知道如何退出。作为开发人员,不能 100% 控制两者可能(可以理解)令人沮丧,但实际上用户可能会很好,因为他们会使用一个另一个。

【讨论】:

    【解决方案2】:

    使用shortcut.js 来操作按键。挺好的。

    示例代码:

    shortcut.add("F11",function() {
        alert("F11 PRESS");
    });
    

    或者

    JSFiddle Exemple

    【讨论】:

    • 不幸的是,您的示例在全屏模式下没有触发回调!在全屏模式下,我仍然无法捕捉到任何关键事件。抱歉,但这并不能解决问题。我会要求你删除你的答案,以防没有更高评价的回复,赏金是不应该的。
    • 所以这个问题的答案是:这是不可能的。
    • 一次全屏需要按F11禁用,不能停止。
    【解决方案3】:

    您可以使用display-mode: fullscreen 媒体查询,它可以正确捕获全屏 API 更改和 F11。

    CSS 版本:

    #fullscreen::before {
        content: 'not ';
    }
    
    @media (display-mode: fullscreen) {
        #fullscreen::before {
            content: none;
        }
    }
    <span id='fullscreen'>fullscreen</span>

    JavaScript 版本:

    const el = document.getElementById('fullscreen')
    
    const query = matchMedia('(display-mode: fullscreen)')
    const handler = e => {
        el.innerHTML = (e.matches ? '' : 'not ') + 'fullscreen'
    }
    
    handler(query)
    query.addListener(handler)
    <span id='fullscreen'></span>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 2018-07-06
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多