javascript - 插入后将功能策略设置为 iframe
问题描述
尝试在 Firefox 中请求全屏时出现此问题。
Request for fullscreen was denied because of FeaturePolicy directives
我正在尝试在加载页面之前使用函数将allow
iframe 节点中的属性从allow='autoplay; fullscreen'
to设置allow='autoplay; fullscreen *'
为 javascriptsetAttribute
并且它运行良好,但是当我在页面加载后设置它时它不起作用。我看到 DOM 改变了值,但它没有效果。我试图通过将源更改为相同来重新加载 iframe,但重新加载后它将变为空白。
解决方案
如测试所示,allow=
通过脚本更改属性不会更改在 iframe 内起作用的功能策略权限。
这是因为allow=
属性的权限是在 DOM 构建阶段应用的。
因此,您必须重新加载 iframe 内容以应用更改的功能策略权限。
重新加载 iframe 内容完成工作 - 应用新权限。尝试这样做:
iframe = document.getElementById('id_of_frame');
iframe.setAttribute('allow', "autoplay; fullscreen *;");
iframe.src = iframe.src;
请注意,allow="fullscreen"
确实允许与 完全相同allow="fullscreen *"
,两者都意味着 iframe 内的所有元素都允许具有全屏模式。
这是因为权限转换为<iframe>
一个,其中表示 iframe属性中 URL 的来源。
您可以在上面的测试中观察到这一点,也可以自己检查:fullscreen *
fullscreen 'src'
'src'
src=
// array of allowed origins for 'fullscreen' feature:
var origins = featurePolicy.getAllowlistForFeature('fullscreen');
里面<iframe src='https://example.com' allow="fullscreen *">
会origins
而https://example.com
不是*
。
通配符*
仅在功能策略 HTTP 标头中有意义 - 如果它允许页面上的任何内容中fullscreen *
的全屏模式。<iframe src='...'>
推荐阅读
- javascript - 在不使用 gmail smtp 的情况下发送电子邮件 nodemailer
- assembly - 链接汇编程序生成的 obj 文件
- c - memset上的程序崩溃?
- javascript - 将jquery ajax post请求转换为获取api
- python - 在 Flask-SQLAlchemy 中更新表 - 访问不正确的表 ID
- c++ - 使用 C++ 中的自定义 api 无法通过 curl 登录
- php - 迁移到 php7.3 如何检查 php 版本
- julia - 如何防止 StatsPlots.jl 重新排序分类数据
- python - Python数据框计算不适用于所有列
- c++ - C++ Builder 10.4 和 Tinyxml