Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当从promise调用window.open()时,浏览器会阻止它_Javascript_Ajax_Angularjs - Fatal编程技术网

Javascript 当从promise调用window.open()时,浏览器会阻止它

Javascript 当从promise调用window.open()时,浏览器会阻止它,javascript,ajax,angularjs,Javascript,Ajax,Angularjs,我有这样的代码: window.open('https://api.instagram.com/oauth/authorize/', '_blank', 'width=700,height=500,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=0,top=0,modal=yes'); 当从代码的任何地方调用时,它都可以正常工作,但当我在promise中使用它时(见下文),它总是被浏览器阻止。有什么建议

我有这样的代码:

window.open('https://api.instagram.com/oauth/authorize/',
'_blank',
'width=700,height=500,toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=0,top=0,modal=yes');
当从代码的任何地方调用时,它都可以正常工作,但当我在promise中使用它时(见下文),它总是被浏览器阻止。有什么建议吗

action().success(function (r) {
  // window.open(...);
}

承诺来自角度。

承诺是响应您从Ajax请求返回HTTP响应而发出的。这不是用户触发的事件,因此弹出窗口被阻止。使用用户提供的窗口,而不是创建新窗口。

解决此问题的方法是

  • 立即打开窗口并保留引用(如果合法,即在事件处理程序中)
  • 启动异步操作
  • 然后,在承诺中,使用您打开的窗口并填充它(您可以使用
    win.location

  • 如果我事先不知道是否需要打开弹出窗口,该怎么办?比如:
    action().then(dowindopenthing).catch(dosomethingelsethattodesntopenapopup)
    所以如果以后我不再使用它,我就不能打开一个窗口(保留它的引用等),对吗?@luiz一个老套的解决方案可能是打开那个窗口,如果不需要的话关闭它。但我会寻找一种基于人体工程学的解决方法,例如,进行可能会失败的查询,然后显示一个对话框“the thing worked,you want to view the result in a new window?”。另外两个答案更好,应该被接受,而不是说您不能这样做的答案。
                var newTab = $window.open('', '_blank');
            promise
                .then(function () {
                    var url = '...';
                    newTab.location.href = url;
                });