Javascript请求全屏不可靠

zrfyljdw  于 2022-12-28  发布在  Java
关注(0)|答案(5)|浏览(855)

我正在尝试使用JavaScript FullScreen API,从这里开始使用当前非标准实现的变通方法:
https://developer.mozilla.org/en/DOM/Using_full-screen_mode#AutoCompatibilityTable
可悲的是,它的行为非常不稳定。我只关心Chrome(使用V17),但由于我遇到了问题,我在Firefox 10中做了一些测试进行比较,结果类似。
下面的代码试图将浏览器设置为全屏,有时可以,有时不能。它总是调用警报来指示它正在请求全屏。下面是我发现的:

  • 它通常设置为全屏。它可以达到这样一种状态,即它停止工作,但警报仍然发生,即它仍然要求全屏,但它不工作。
  • 如果从按键处理程序(document. onkeypress)调用它,它可以工作,但在页面加载(window. onload)时调用它就不行了。

我的代码如下:

function DoFullScreen() {

    var isInFullScreen = (document.fullScreenElement && document.fullScreenElement !==     null) ||    // alternative standard method  
            (document.mozFullScreen || document.webkitIsFullScreen);

    var docElm = document.documentElement;
    if (!isInFullScreen) {

        if (docElm.requestFullscreen) {
            docElm.requestFullscreen();
        }
        else if (docElm.mozRequestFullScreen) {
            docElm.mozRequestFullScreen();
            alert("Mozilla entering fullscreen!");
        }
        else if (docElm.webkitRequestFullScreen) {
            docElm.webkitRequestFullScreen();
            alert("Webkit entering fullscreen!");
        }
    }
}
iklwldmw

iklwldmw1#

由于安全原因(至少在Chrome中),无法自动调用requestFullscreen()。因此只能通过用户操作调用,例如:

  • 单击(按钮、链接...)
  • 键(按下键、按下键...)

如果文档包含在框架中:

  • allowfullscreen需要存在于<iframe>元素上 *
  • W3质量标准:

“...若要防止嵌入内容全屏显示,只有通过HTML iframe元素的allowfullscreen属性特别允许的嵌入内容才能全屏显示。这将防止不受信任的内容全屏显示...”
阅读更多:W3 Spec on Fullscreen
@abergmeier还提到,在Firefox上,全屏请求必须在用户生成的事件触发后1秒内执行。

pvcm50d1

pvcm50d12#

我知道这是一个很老的问题,但它仍然是谷歌搜索FireFox的错误消息时,从代码调用mozRequestFullScreen(),没有任何用户交互触发的顶部结果。
全屏请求被拒绝,因为未从短时间运行的用户生成的事件处理程序内部调用Element.mozRequestFullScreen()。
如前所述,这是一项安全设置,因此在正常浏览器环境(最终用户计算机)中是正确的行为。
但是我正在写一个基于HTML5的数字标牌应用程序,它在一个受控的环境下运行,没有任何用户交互。它是至关重要的,我的应用程序能够切换到全屏自动。
幸运的是FireFox提供了一个可能性,以消除这一限制的浏览器,这是相当困难的找到。我会写在这里作为未来的参考,为大家找到这个网页通过谷歌搜索,因为我没有
about:config页面上搜索以下键并将其设置为false

full-screen-api.allow-trusted-requests-only

对于我的数字标牌应用程序,我还删除了进入fullscreen时浏览器显示的提示:

full-screen-api.approval-required

希望这可能会保存一些人的时间,我浪费了找到这些设置。

vfhzx4xs

vfhzx4xs3#

您的函数没有问题,在Firefox中,如果您直接调用该函数,它会阻止全屏,您知道,全屏请求被拒绝是因为docElm.mozRequestFullScreen();不是从一个短时间运行的用户生成的事件处理程序中调用的。所以,你必须在事件上调用这个函数,比如在Firefox中调用onClick。

<a href="#" onClick="DoFullScreen()">Full Screen Mode</a>
tp5buhyn

tp5buhyn4#

requestFullscreen()的另一个意外问题是父帧需要具有allowfullscreen属性,否则Firefox会输出以下错误:
全屏请求被拒绝,因为文档的至少一个包含元素不是iframe或没有“allowfullscreen”属性。
除了iframe之外,这也可能是由于您的页面位于frameset框架中。由于frameset已被弃用,因此不支持HTML5 allowfullscreen属性,requestFullscreen()调用失败。
Firefox文档在MDN上明确说明了这一点,但我认为值得在这里重申,因为开发人员可能没有先阅读文档...... ahem
只有顶级文档或中具有allowfullscreen属性的元素才能全屏显示。这意味着frameobject中的元素不能。

lh80um4z

lh80um4z5#

我知道这是一个老职位,但如果其他人发现这一点,我想添加一些建议和样本代码。
为了帮助避免此错误...
无法对“元素”执行“requestFullscreen”:API只能由用户手势启动。
不要测试 requestFullscreen() 是否存在,这是一个方法,而是测试像 document.fullscreenEnabled 这样的属性是否存在。
还要考虑以下几点...

  • 将全屏检查移到它自己的函数中,以便重用它。
  • 通过将要影响的元素作为参数传递,使DoFullScreen()可重用。
  • 在DoFullScreen()的顶部使用一个guard clause,如果窗口已经处于全屏模式,可以立即退出函数,这也简化了逻辑。
  • 为DoFullScreen()元素参数设置默认值,以确保始终在现有元素上调用 requestFullscreen() 方法。默认为 document.documentElement 可能会保存一些击键操作。
// Move your fullscreen check into its own function
function isFullScreen() { 
  return Boolean(
    document.fullscreenElement ||
      document.webkitFullscreenElement ||
      document.mozFullScreenElement ||
      document.msFullscreenElement
  );
}

// Make DoFullScreen() reusable by passing the element as a parameter
function DoFullScreen(el) { 
  // Use a guard clause to exit out of the function immediately
  if (isFullScreen()) return false;
  // Set a default value for your element parameter
  if (el === undefined) el = document.documentElement; 
  // Test for the existence of document.fullscreenEnabled instead of requestFullscreen()
  if (document.fullscreenEnabled) { 
    el.requestFullscreen();
  } else if (document.webkitFullscreenEnabled) {
    el.webkitRequestFullscreen();
  } else if (document.mozFullScreenEnabled) {
    el.mozRequestFullScreen();
  } else if (document.msFullscreenEnabled) {
    el.msRequestFullscreen();
  }
}

(function () {
  const btnFullscreenContent = document.querySelector(".request-fullscreen-content");
  const el = document.querySelector(".fullscreen-content");
  // Request the .fullscreen-content element go into fullscreen mode
  btnFullscreenContent .addEventListener("click", function (){ DoFullScreen(el) }, false);

  const btnFullscreenDocument = document.querySelector(".request-fullscreen-document");
  // Request the document.documentElement go into fullscreen mode by not passing element
  btnFullscreenDocument .addEventListener("click", function (){ requestFullscreen() }, false);
})();

相关问题