Google chrome clients.openWindow();不允许打开窗户。”;在一个服务人员谷歌浏览器上
我在Chrome 42.0.2311.152m版本下进行测试,我想实现在通知上打开一个窗口,如本例中所示:(来源: ) 从未到达“return client.focus()”行,因为client.url永远不只是“/”。 看着Google chrome clients.openWindow();不允许打开窗户。”;在一个服务人员谷歌浏览器上,google-chrome,service-worker,Google Chrome,Service Worker,我在Chrome 42.0.2311.152m版本下进行测试,我想实现在通知上打开一个窗口,如本例中所示:(来源: ) 从未到达“return client.focus()”行,因为client.url永远不只是“/”。 看着 clients.matchAll({type: "window"}) .then(function (clientList) { console.log(clientList[0])}); 我看到我当前的WindowClient: {focused: false, fr
clients.matchAll({type: "window"})
.then(function (clientList) {
console.log(clientList[0])});
我看到我当前的WindowClient:
{focused: false,
frameType: "top-level",
url: "https://myurl.no-ip.org/app/index.html",
visibilityState: "hidden" }
属性“聚焦”和“可见性状态”正确且更改正确。通过手动呼叫焦点
clients.matchAll({type: "window"})
.then(function (clientList) {
clientList[0].focus()});
我收到错误消息:
{code: 15,
message: "Not allowed to open a window.",
name: "InvalidAccessError"}
{code: 15,
message: "Not allowed to focus a window.",
name: "InvalidAccessError"}
我认为问题在于url不仅仅是“/”。你对此有什么想法吗
多谢各位致以最诚挚的问候
Andi您的代码对我来说运行良好,因此我将解释使用
openWindow
/focus
的要求,以及如何避免出现“不允许[open | focus]a window”错误消息
clients.openWindow()
和windowClient.focus()
仅在单击通知后才允许使用(至少在Chrome 47中),并且在单击处理程序期间,最多可以调用其中一个方法。此行为在中指定
如果您的openWindow
/focus
呼叫被拒绝,并显示错误消息
“不允许打开窗口。”对于openWindow
“不允许对焦窗口。”对于
focus
然后您没有满足openWindow
/focus
的要求。例如(所有点也适用于focus
,而不仅仅是openWindow
)
- 未单击通知时调用了openWindow
是在openWindow
处理程序返回后调用的,并且您没有调用notificationclick
事件。等待直到
带有承诺
- 在传递给
得到解决事件的承诺后调用了
。等待openWindow
- 承诺没有得到解决,但它花费了“太长时间”(),因此调用
的临时权限过期openWindow
通知单击处理程序完成之前,最多调用一次openWindow
/focus
正如我之前所说,问题中的代码是有效的,因此我将展示另一个带注释的示例
//serviceworner.js
self.addEventListener('notificationclick',函数(事件){
//关闭通知。
event.notification.close();
//示例:3秒钟后打开窗口。
//(顺便说一句,这样做是一种糟糕的用户体验,因为
//用户在3秒钟内不知道会发生什么。)
var承诺=新承诺(函数(解析){
setTimeout(解析,3000);
}).然后(函数(){
//返回openWindow返回的承诺,以防万一。
//打开任何原点仅在Chrome 43+中有效。
返回clients.openWindow('https://example.com');
});
//现在,等待保持许可有效的承诺。
事件。等待(承诺);
});
index.html
显示通知
navigator.serviceWorker.register('serviceWorker.js');
document.getElementById('show-notification-btn')。onclick=function(){
Notification.requestPermission(函数(结果){
//结果='允许'/'拒绝'/'默认'
如果(结果!=“拒绝”){
navigator.serviceWorker.ready.then(函数(注册){
//显示通知。如果用户单击此
//通知,然后触发“notificationclick”。
注册。显示通知(“测试”);
});
}
});
}
另外,服务人员仍在开发中,因此值得一提的是,我已经验证了上述评论在Chrome 49中是正确的,并且示例在Chrome 43+中工作(并打开/
而不是https://example.com
也适用于Chrome 42).我以前没有看到过这个具体错误,我自己也无法重现。Chrome43将很快成为稳定的版本(并且已经在一些平台上)。你能在那里复制吗,或者在Chrome dev/Canary中复制吗?我们有一些类似的代码,似乎可以在Mac上的Chrome上运行,但在Windows上却不能。你测试的是什么操作系统?超时的目的是什么?你能直接打开窗口吗?@capouch演示异步行为。是的,超时使事情变得复杂,但它也是展示我们还能做什么的好方法。如果要立即打开窗口,请执行event.waitUntil(clients.openWindow('page.html')
@RobW如何确定何时需要使用waitill
?解决方案是什么?你写的问题代码是正确的,但它不起作用!那么它怎么可能是正确的呢?还有,你的解决方案,不要提供任何解决方案!显然,您的示例代码也不起作用
{code: 15,
message: "Not allowed to focus a window.",
name: "InvalidAccessError"}