带有 allow="geolocation" 的 iframe 效果很好。但是,如果我想加载一个从 html 锚标记调用 getCurrentPosition() 的链接怎么办?
示例:在 iframe 中,我将使用
<iframe src="https://siteWhichCallsGetGeolocation.com" allow='geolocation'></iframe>
我有一个用例,其中 html 嵌入链接如
<a href="https://siteWhichCallsGetGeolocation.com">Click here to get geolocation</a>
嵌入在父站点中。父站点在它自己的 iframe 中加载子链接
需要注意的是,父站点的 iframe 具有 allow="geolocation" 属性。
在这种情况下,请求被静默拒绝并出现错误
错误代码:1
errorMessage:“地理定位已被权限策略在此文档中禁用。”
功能策略文档指向 iframe,但是锚标记嵌入呢?
我知道我可以使用 iframe 而不是嵌入锚标记,但父站点只允许使用锚标记。
PS - 这是我在这里的第一个问题。请协助。
笔记 :
- 我还尝试通过将 allow="geolocation" 包含在锚标记中来进行随机拍摄,但它不起作用。
- 这似乎适用于 Safari(我假设这是因为 Safari 尚未为跨源站点请求实施功能策略)
编辑 1:
我在 jsfiddle 中尝试了我的用例,并注意到我提供的所有脚本(iframe 或锚标记)都加载到 jsfiddle 的 iframe 中
<iframe name="result" allow="midi; geolocation; microphone; camera; display-capture; encrypted-media;" sandbox="allow-modals allow-forms allow-scripts allow-same-origin allow-popups allow-top-navigation-by-user-activation allow-downloads" allowfullscreen="" allowpaymentrequest="" frameborder="0" src=""> </iframe>
如果我在其中加载我的 iframe,它会完美运行!(完美平衡,因为所有东西都应该......)
但是,如果我在其中加载我的锚标签,我会收到错误消息。根据granty的回答
带有allow='geolocation' 的jsfiddle 的iframe 应该设置jsfiddle 站点的功能策略,即在该iframe 中加载的所有脚本都可以访问地理位置,对吗?为什么我在 jsfiddle 的 iframe 中的 iframe 可以工作,但锚标签却不行?
注意 - 我无法控制顶级站点。我只编写脚本https://siteWhichCallsGetGeolocation.com
解决方案(如果您可以控制顶级文档的功能策略或控制任何<iframe>
具有地理定位权限的中间体)(来自授予的答案)
我尝试了建议的解决方案,通过检查元素将 jsfiddle 的 iframe 属性更改为
<iframe name="result" allow="midi; geolocation https://siteWhichCallsGetGeolocation.com ; microphone; camera; display-capture; encrypted-media;" sandbox="allow-modals allow-forms allow-scripts allow-same-origin allow-popups allow-top-navigation-by-user-activation allow-downloads" allowfullscreen="" allowpaymentrequest="" frameborder="0"></iframe>
为了突出显示,我在许可名单中的地理位置旁边添加了我的网站,例如
allow="midi;地理位置
https://siteWhichCallsGetGeolocation.com
;
然后加载我的锚标签。当从 加载的脚本触发 getCurrentPosition() 时https://siteWhichCallsGetGeolocation.com
,我得到浏览器提示以允许/拒绝位置共享。我允许并得到了坐标!
哇!如果它可以像通过检查元素编辑顶级文档的功能/权限策略一样简单。
但是,唉,我无法控制顶级文档的功能策略。至少我明白幕后发生了什么。