RequestStorageAccess - 如果拒绝访问则启动弹出窗口 Window
RequestStorageAccess - Launch Popup Window If Denied Access
我正在实施 Apple 的 requestStorageAccess API 以请求跨域 iFrame 中的 cookie 访问。
我们遇到的一个问题是,如果不是用户交互的直接部分,Safari 会阻止弹出窗口,这使得整个体验非常不愉快,因为用户需要单击“单击此以查看...”按钮两次 以便在第一方上下文中查看站点。
流程(如下图所示)大致是:
- 检查我们是否有 cookie read/write 访问权限
- 如果是,则从 iFrame 发送 POST 请求以加载数据。
- 如果不是,则显示带有 requestStorageAccess 单击处理程序的按钮。
- 如果 requestStorageAccess 解析为真,则重新加载框架或发送 XHR 请求。
- 如果 requestStorageAccess 解析为 false(我们希望在新框架中启动)。不过,Safari 会阻止来自 catch 块的 window.open 调用。我们发现的唯一其他选项是显示 第二个按钮 要求用户 再次单击 ,以启动新的 window.
有更好的方法吗?当 requestStorageAccess 未解析为 true 时,标准的“失败”模式是什么?
示例代码中似乎有一些错误:
requestStorageAccess()
是Document
接口的一个方法:document.requestStorageAccess()
.
then()
方法调用缺少右括号。
- url inside
window.open()
必须用引号引起来:window.open("appointments.html")
.
这是您的代码,已更正所有错误:
document.requestStorageAccess().then(_=>
{
// load appointments
}).catch(_=> {
// launch popup
window.open("appointments.html");
// safari blocks this popup since it's part of a promise it is not directly part of a click action...
});
现在,要使此代码正常工作,您需要将弹出窗口打开代码从 catch()
移动到 then()
的错误回调中:
document.requestStorageAccess().then(_=>
{
// load appointments
}, _ => {
// launch popup
window.open("appointments.html");
});
现在,此代码之所以有效,是因为 requestStorageAccess()
promise 实际上正在处理直接用户手势(按钮单击)并将其传递到 then()
回调中。但显然不是 catch()
.
What is the standard "failure" pattern when requestStorageAccess does not resolve to true?
我可以推荐阅读官方 Introducing Storage Access API 博客 post。
我正在实施 Apple 的 requestStorageAccess API 以请求跨域 iFrame 中的 cookie 访问。
我们遇到的一个问题是,如果不是用户交互的直接部分,Safari 会阻止弹出窗口,这使得整个体验非常不愉快,因为用户需要单击“单击此以查看...”按钮两次 以便在第一方上下文中查看站点。
流程(如下图所示)大致是:
- 检查我们是否有 cookie read/write 访问权限
- 如果是,则从 iFrame 发送 POST 请求以加载数据。
- 如果不是,则显示带有 requestStorageAccess 单击处理程序的按钮。
- 如果 requestStorageAccess 解析为真,则重新加载框架或发送 XHR 请求。
- 如果 requestStorageAccess 解析为 false(我们希望在新框架中启动)。不过,Safari 会阻止来自 catch 块的 window.open 调用。我们发现的唯一其他选项是显示 第二个按钮 要求用户 再次单击 ,以启动新的 window.
有更好的方法吗?当 requestStorageAccess 未解析为 true 时,标准的“失败”模式是什么?
示例代码中似乎有一些错误:
requestStorageAccess()
是Document
接口的一个方法:document.requestStorageAccess()
.then()
方法调用缺少右括号。- url inside
window.open()
必须用引号引起来:window.open("appointments.html")
.
这是您的代码,已更正所有错误:
document.requestStorageAccess().then(_=>
{
// load appointments
}).catch(_=> {
// launch popup
window.open("appointments.html");
// safari blocks this popup since it's part of a promise it is not directly part of a click action...
});
现在,要使此代码正常工作,您需要将弹出窗口打开代码从 catch()
移动到 then()
的错误回调中:
document.requestStorageAccess().then(_=>
{
// load appointments
}, _ => {
// launch popup
window.open("appointments.html");
});
现在,此代码之所以有效,是因为 requestStorageAccess()
promise 实际上正在处理直接用户手势(按钮单击)并将其传递到 then()
回调中。但显然不是 catch()
.
What is the standard "failure" pattern when requestStorageAccess does not resolve to true?
我可以推荐阅读官方 Introducing Storage Access API 博客 post。