Google chrome clients.openWindow();不允许打开窗户。”;在一个服务人员谷歌浏览器上

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

我在Chrome 42.0.2311.152m版本下进行测试,我想实现在通知上打开一个窗口,如本例中所示:(来源: )

从未到达“return client.focus()”行,因为client.url永远不只是“/”。 看着

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"}