HTML5 - 防止全屏模式

2024-04-25

我正在使用全屏API https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API使用嵌入的 YouTube 视频来检测浏览器窗口是否已进入全屏模式。我的效果很好。

我想做的是防止发生进入全屏模式的默认行为。我想放入自己的全屏模式逻辑,以便可以将 DOM 元素覆盖在 YouTube 播放器之上。目前,我可以在进入全屏模式后立即退出全屏模式,但这会给用户带来糟糕且令人困惑的体验。

一种解决方法是使用 YouTube 的播放器 API 参数删除全屏按钮,并使用我自己的逻辑添加我自己的按钮,但这并不理想,因为用户仍然可以双击 YouTube 播放器以使其全屏。

这是我用于检测浏览器全屏状态的代码:

$(document).on("fullscreenchange webkitfullscreenchange msfullscreenchange mozfullscreenchange", function(event)
{
    onFullScreenChange(event);
});

function onFullScreenChange(event)
{
    var fullScreenElement =
        document.fullscreenElement ||
        document.msFullscreenElement ||
        document.mozFullScreenElement ||
        document.webkitFullscreenElement;

    var isFullscreen = !!fullScreenElement;

    console.log("In fullscreen mode?", isFullscreen);

    if (isFullscreen === true)
    {
        // TODO: Prevent the browser from entering full screen mode. These three lines don't prevent that behavior
        event.stopImmediatePropagation();
        event.stopPropagation();
        event.preventDefault();
        return false;

        // The commented code below works. Ideally, we'd want to prevent the browser from even entering full screen mode 
        //document.webkitExitFullscreen();
    }
}

Using preventDefault(), stopPropagation(), and stopImmediatePropagation()没有用,所以我被困在这一点上。如果确实可能的话,如何防止浏览器进入全屏模式?


Using YouTube iframe API https://developers.google.com/youtube/iframe_api_reference

禁用全屏按钮:fs: 0

禁用键盘控制:禁用kb: 1

当播放器加载时,删除全屏选项:

// Get DOM video player not YT videoplayer
videoPlayer = document.getElementById('player');
// don't allow full screen 
videoPlayer.allowFullscreen = false;

使用 Fullscreen_API 在 DOM 播放器(在我们的例子中是 iframe)上触发全屏

videoPlayer.requestFullScreen()

如果按下 ESC 键或视频结束,将发生全屏离开(自定义事件处理)

JsFiddle https://jsfiddle.net/4zg5ofdp/ 工作示例:

   <!DOCTYPE html>
<html>
<body>
    <!-- The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>
    <br />
    <button id="fullScreenPlayer">Full Screen Player</button>

    <script>
        // DOM player
        var videoPlayer;
        // This code loads the IFrame Player API code asynchronously.
        var tag = document.createElement('script');

        tag.src = "https://www.youtube.com/iframe_api";
        var firstScriptTag = document.getElementsByTagName('script')[0];
        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

        //  This function creates an <iframe> (and YouTube player)
        //  after the API code downloads.
        var player;
        function onYouTubeIframeAPIReady() {
            player = new YT.Player('player',
            {
                height: '390',
                width: '640',
                videoId: 'nAgKA7R4Fz4',
                // params: https://developers.google.com/youtube/player_parameters?playerVersion=HTML5
                playerVars: { 'fs': 0, 'disablekb': 1, 'rel': 0 },
                events: {
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                }
            });
        }

        // The API will call this function when the video player is ready.
        function onPlayerReady(event) {
            event.target.playVideo();
            // Get DOM video player not YT videoplayer
            videoPlayer = document.getElementById('player');
            // don't allow full screen 
            videoPlayer.allowFullscreen = false;
            // Listen for fulscreen changes, if you need custom logic here, but I won't recommned that, it's to complex and you don't have control inside YT iframe
            videoPlayer.addEventListener("fullscreenchange", fullScreeCallback, false);
            videoPlayer.addEventListener("webkitfullscreenchange", fullScreeCallback, false);
            videoPlayer.addEventListener("msfullscreenchange", fullScreeCallback, false);
            videoPlayer.addEventListener("mozfullscreenchange", fullScreeCallback, false);
        }

        //   If the video reach the end then player will leave full screen
        function onPlayerStateChange(event) {
            if (event.data == YT.PlayerState.ENDED) {
                leaveFullscreen();
            }
        }
        function stopVideo() {
            player.stopVideo();
        }

        // fullscreen event handller
        function fullScreeCallback(e) {
            // do what you like when you catch the event
            console.log(e);
            return false;

        }

        var goFullscreen = function () {
            if (videoPlayer === undefined) throw "player is undefined";
            if (videoPlayer.requestFullScreen) {
                videoPlayer.requestFullScreen();
            } else if (videoPlayer.mozRequestFullScreen) {
                videoPlayer.mozRequestFullScreen();
            } else if (videoPlayer.webkitRequestFullScreen) {
                videoPlayer.webkitRequestFullScreen();
            }
        }

        var leaveFullscreen = function () {
            if (document.cancelFullScreen) {
                document.cancelFullScreen();
            } else if (document.mozCancelFullScreen) {
                document.mozCancelFullScreen();
            } else if (document.webkitCancelFullScreen) {
                document.webkitCancelFullScreen();
            }
        }

        document.getElementById('fullScreenPlayer').addEventListener("click", function(e) {
            goFullscreen();
        }, false);


    </script>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 - 防止全屏模式 的相关文章

  • Spring MVC 415 不支持的媒体类型

    我正在使用 Spring 3 2 并尝试使用 ajax post 请求来提交 json 对象数组 如果这是相关的 我转义了所有特殊字符 我收到的 HTTP 状态为 415 我的控制器是 RequestMapping value save p
  • CSS 布局:2 列固定流体(再次)

    我正在尝试设置一个 2 列布局 其中左侧区域是固定的 主要内容是流动的 我在这里看到了几个答案 它们往往有效 然而 当我在 左侧 区域使用 jsTree 并在主 内容区域使用 jQuery UI 选项卡时 会出现一些奇怪的行为 html d
  • 简单的php ajax请求url

    我有很多这样的链接 不同的项目有不同的链接 a class member href http ex com action php me 1 link1 a 所以当我点击这个我想导航到action php从这里 here php 我正在使用
  • 加载一张随机 flickr 图像并附加到 div

    我基本上试图加载从特定用户和特定集合中获取的随机 flickr 图像 然后将其显示在 ID 为 flickr wrap 的 div 中 我正在尝试操纵此 JSON 代码来执行我想要的操作 但不知道从哪里开始 这段代码当前加载了很多图像 我只
  • 如何确定输入的模式是“Int,VarChar,Date,Time ...”等

    我有一个下拉菜单 其中包含DataType 和一个文本框 这是用于输入的Regex Pattern 如果我进入 test 在文本框中 或从下拉菜单中选择Int 如果在文本框中输入 则其模式是错误的 0 9 那么它的correct patte
  • 使用 JS 或 Jquery 禁用浏览器窗口中的声音

    有没有办法禁用可能嵌入视频的浏览器窗口上的所有声音 我不是在寻找特定的解决方案 例如使用 js 等定位 Youtube 我需要一些通用的东西来关闭该页面的所有声音 这样如果任何视频播放它就没有声音 需要一些在页面级别关闭声音的东西 而不是通
  • 当鼠标悬停在选择下拉列表上时,包含 div 会失去焦点

    我有一个 div 当您将鼠标悬停在其容器上时 该 div 会出现 并且该 div 是绝对定位的 因此它会出现在其容器之外 它里面有多个选择下拉菜单 当我尝试更改其中任何一个的值时 焦点就会丢失 它会触发容器上的鼠标移出 我在这里设置了这个问
  • JS jQuery - 检查值是否在数组中

    我更喜欢 PHP 而不是 JS 我认为我的问题更多是语法问题 我有一个小的 jQuery 来 验证 并检查输入值 它适用于单个单词 但我需要数组 我正在使用inArray jQuery 的 var ar value1 value2 valu
  • jQuery UI .buttonset() 太慢

    我的 HTML 页面上有几千个按钮 运行需要10多秒 buttonset buttonset 文件准备好 有没有更快的方法来做到这一点 或者是我以某种方式限制按钮数量的唯一解决方案 创建buttonset在第一次显示之前按需进行 我刚刚测试
  • jQuery 如何修复无法设置未定义的属性“_DT_CellIndex”?

    我是 Jquery 的新手 我希望一旦用户添加新行并在单击 Ajouter 按钮后提供重要信息 它将添加到数据库中 然后自动重新加载表 一旦我运行 我发现数据已成功添加到数据库 但是 tablebqup 不再重新加载 并且我发现了此错误 U
  • AngularJS 计数器计数到目标数

    我是 Angular 的新手 想在 JQuery 中实现同样简单的函数扩展 但使用指令 据我所知 这就是应该如何完成的 有人知道准备实施吗 我的搜索最终只找到了 JQuery 解决方案 但我不知道如何将其转换为 Angular 这就是我需要
  • jQuery Cycle 幻灯片的动画内容

    每张幻灯片都由标题框和图像组成 div div class slide div class slideTitle h2 First title h2 div img src image jpg div div class slide div
  • 如何使用 jQuery 和“长轮询”通过 Indy HTTP 服务器动态更新 HTML 页面?

    我读过这篇文章使用 JavaScript 和 jQuery 的简单长轮询示例 http techoctave com c7 posts 60 simple long polling example with javascript and j
  • 显示选定的文件而不回发

    我有一个
  • 如何使用 jsPDF 和 HTML2Canvas 从网站获取多页 pdf?

    我有一个使用 HTML2Canvas 来截取屏幕截图的脚本div在页面中 然后使用 jsPDF 将其转换为 pdf 问题是生成的 pdf 只有一页 而屏幕截图在某些情况下需要不止一页 例如 屏幕截图大于 8 5x11 宽度很好 但我需要它来
  • 在 jQuery 中删除或更改 CSS 伪类

    一个足够简单的问题 如此简单 是否可以使用 jQuery 删除或更改 CSS 伪类 或者任何其他与此相关的 Javascript 方法 具体来说 我想摆脱 专注于输入 我无法以任何方式直接更改 CSS 文件 谢谢你的帮助 Buster 我无
  • 将屏幕大小从小屏幕调整为大屏幕时,jQuery 数据表宽度发生错误更改

    我用过responsive数据表的特点 https datatables net extensions responsive examples display types immediateShow 对于大屏幕 视图是这样的 对于小屏幕 视
  • 插入标准模式文档中的动态 iframe 默认为怪异模式

    我有一份当前正在返回的父文档CSS1Compat from document compatMode 当我使用 jQuery 添加一个空白 iframe 时 如下所示 body append 并检查新 iframe 的 compatMode
  • jQuery - 解析 JSON 数据 - 变量名称遇到问题

    我第一次深入研究 JSON 数据的使用 不过我有一些使用 jQuery 的经验 我发布到此 URL tumblr api jyoseph com api read json 我想做的是输出返回的 json 到目前为止我所拥有的 docume
  • Jquery获取javascript文件而不运行

    我想使用 jquery 获取文件的内容 通常我可以使用 get file function data alert data 当我尝试获取 javascript 文件时 jquery 在返回回调之前运行 javascript 代码 如何在不运

随机推荐

  • 带有 OAuth 访问令牌的 GitHub 克隆

    在脚本中 我尝试使用 OAuth 令牌克隆 GitHub 存储库 根据本教程 https github com blog 1270 easier builds and deployments using git over https and
  • Node.js |如何通过串口向设备发送和接收一个字节?

    我正在尝试编写使用以下方法的 Node js 脚本serialport https serialport io 用于读取和写入数据的 npm 包COM5串行端口 使用 RS 232 电缆连接到设备 该设备会自动传输其拥有的数据 要检索设备内
  • PHP:如何使浏览器点击下载文件

    PHP 初学者 文件上传成功 但我的浏览器不下载文件 而是读取文件 所以我参考了其他线程并发现下面的代码不起作用 我想在单击超链接时下载文件download 从MySQL数据库中选择路径 rows mysqli num rows resul
  • gcc 4.4.5 中未定义 _GLIBCXX_ATOMIC_BUILTINS

    我有一些正在移植的代码 并且我已经找到了丢失的错误 宏 GLIBCXX ATOMIC BUILTINS 后来的gcc版本没有定义这个吗 解决这个问题的正确方法是什么 在该版本中 您还需要检查某些特定数据类型的原子宏 因此您可以执行以下操作
  • .NET 应用程序无法启动和接收 XamlParseException

    我编写了一个可以在我的开发 PC Windows 7 上安装和运行的应用程序 开发环境 Window 7 VS2010 WPF C 两者都有 NET 4 and NET 3 5已安装 在其他客户端计算机 XP SP3 2和1 上 安装没有错
  • 我在 Joda-Time 中得到两个日期之间的时间错误

    无论我做什么 我都会得到不正确的结果 谁能给我一些建议吗 这是我的程序的代码 负责获取两个日期之间的时间 我得到了结果 但问题是它不正确 并且我无法找到问题 我的项目中有 Joda 库 if timerightnow isSelected
  • iOS - 管理 IBOutlet 内存的最佳方法是什么?

    我一直在查看 Apple 文档和示例代码 试图确定管理 IBOutlet 内存的最佳方法 至少可以说 我有点困惑 CurrentAddress 示例代码将 IBOutlets 声明为属性 interface MapViewControlle
  • 如何为 iOS 构建 PoDoFo 库

    这可能是这个问题的副本如何在 iOS 上使用 PoDoFo 库对 PDF 进行注释 https stackoverflow com questions 7643771 how can i use the podofo library for
  • 调试时的监视窗口:CS0103:当前上下文中不存在名称“

    我正在使用 Visual Studio Community 2022 64 bit Version 17 4 2 with NET Framework Version 4 8 09032 昨天 2022 年 2 月 12 日有更新 我是通过
  • pictureBox 图片处理异常

    我最近想尝试一下锻造网 http www aforgenet com framework 因为我发现它非常简单 所以我决定使用 Video FFMPEG 命名空间进行一些简单的视频播放 这样我就可以将每个帧直接放在 pictureBox 上
  • Android中线程加载的Web图像

    我在 ListActivity 中有一个扩展的 BaseAdapter private static class RequestAdapter extends BaseAdapter 以及其中定义的一些处理程序和可运行对象 Need han
  • Javascript var 提升问题

    我有一个非常简单的 Javascript 函数 它可以访问 MS SQL 服务器并返回一些记录 有一个单元格 我只想在它唯一时才显示在顶部表格行中 我相信我的问题是 var 提升 因为我在 while 循环中分配的变量不起作用 因为该值不是
  • OS X 应用程序图标和菜单栏图标的图标大小

    OS X 的应用程序图标和菜单栏图标应该有多大 我可以处理小分辨率显示屏 但 Retina 显示屏怎么样 在配备 Retina 显示屏的新 MacBook Pro 上 菜单栏上显示的图标 例如 20 x 20 是否会更小或模糊 我认为应用程
  • UITextView不会设置文本

    我在 UITextView 中设置文本时遇到问题 我的 textView 连接到我的 StoryBoard 我控制拖动来创建我的出口 import UIKit class ViewController UIViewController UI
  • 如何从 JavaScript 使用 Opus 编解码器

    我想看看是否可以使用直接访问 OpusgetUserMedia或最新浏览器中的任何类似内容 我对此进行了很多研究 但没有取得好的结果 我知道 Opus 或 Speex 实际上用于webkitSpeechRecognitionAPI 我想做语
  • HTML5 日期选择器不显示在 Safari 上

    之前使用过 jQuery 日期选择器 现在我已将网站表单中的一些日期字段转换为 HTML5 日期选择器 在文档中 它说支持 Safari 但是 它目前仅显示一个文本字段 而 Chrome 和其他浏览器可以正确显示日期选择器 echo
  • swift 4.0:覆盖“prepare”必须与其覆盖的声明一样可用

    我试图将 Apple 的 ARKit 示例应用程序集成到我的应用程序中 由于ARKit只是一个附加功能 所以我需要支持较低版本的iOS 我向所有 ARKit 示例应用程序类添加了 available iOS 11 0 标签 它几乎可以工作
  • 如何使用 scrapy 合约?

    Scrapy 合约问题 我开始研究 scrapy 框架 也实现了一些蜘蛛 提取 但我无法为蜘蛛编写单元测试用例 因为合同 scrapy提供的包文档没有正确的程序来编写 测试用例 请帮我解决这件事 Yes 蜘蛛合约 http doc scra
  • 如何修改此 PowerShell 脚本以将目录名称更改为更低?

    我试图将所有文件和目录重命名为 lower 我在这里找到了一个 powershell 脚本 在 Powershell 中将文件重命名为小写 https stackoverflow com questions 3822745 rename f
  • HTML5 - 防止全屏模式

    我正在使用全屏API https developer mozilla org en US docs Web API Fullscreen API使用嵌入的 YouTube 视频来检测浏览器窗口是否已进入全屏模式 我的效果很好 我想做的是防止