我们正在使用promise库Q,遇到以下问题。window.open() is blocked by browser when is called from promise
我们尝试在承诺机制启动之前打开窗口,这是有效的,但问题是当一个新的选项卡打开(并获得焦点)时,所有浏览器资源都指向新的选项卡,逻辑仍然在第一个选项卡中完成,这导致性能下降。
还有一种方法可以处理这个问题,可能是在承诺完成时使用事件,然后捕获这个事件并打开新窗口。
更新
“所有浏览器资源都指向新选项卡”是什么意思?我们发现了有趣的行为:)当用户单击按钮时,我们正在运行应用程序,在这种情况下,我们打开新选项卡,焦点更改为新选项卡,我们等待应用程序启动,这大约需要15秒(直到应用程序实际运行)。我们做了以下测试(非常有趣:)),当我们单击运行应用程序,新选项卡打开时,我们立即单击返回到第一个选项卡(其中有按钮),通过这样做,时间减少到4.5秒!似乎焦点改变了浏览器处理资源的方式。
我在寻找替代方案!
2条答案
按热度按时间tjrkku2a1#
这是因为两项政策之间存在冲突:
1.根据规范,promise异步执行
.then()
处理程序(在当前事件循环完成之后)。1.出于可用性和安全性原因,
window.open()
只能从直接用户操作调用(在由用户操作启动的同一事件循环处理期间或在某个用户操作之后的短时间内)。由于#2,您将无法从遵循promise规范的promise的
.then()
处理程序打开窗口。通常的解决方法是在用户单击时同步打开窗口(在承诺被解析之前),然后在承诺被解析时填写您已经打开的窗口的内容,或者在错误情况下关闭窗口。这并不理想,但是如果在打开窗口时涉及异步操作,除了在浏览器插件中获得提升的权限(不是从正常的网页脚本)之外,真的没有其他选择。
要获得有关如何解决实现此变通方法时的特定编码问题的更详细帮助,您必须将实际代码添加到问题中,并描述遇到的特定问题。
请求特定代码帮助的问题必须包括您需要帮助的代码。
slwdgvem2#
这是我的变通方法。HTML:
在承诺范围内