我遇到一种情况,当用户按下按钮时,我会执行ajax请求,然后使用ajax请求的结果生成要在新选项卡中打开的URL。但是,在chrome中,当我在ajax请求的成功处理程序中调用window.open时,它将在新窗口中像弹出窗口一样打开(并被popup- blockers阻止)。我的猜测是,由于成功代码与chrome认为不是由点击触发的点击处理代码是异步的,即使它与点击有因果关系。有什么方法可以防止这种情况,而无需使ajax请求同步?
编辑 以下是一些最小的代码来演示此行为:
$('#myButton').click(function() { $.ajax({ type: 'POST', url: '/echo/json/', data: {'json': JSON.stringify({ url:'http://google.com'})}, success: function(data) { window.open(data.url,'_blank'); } }); });
http://jsfiddle.net/ESMUA/2/
需要澄清的一点是:我更担心它是在单独的窗口而不是选项卡中打开,而不是因为它被弹出窗口阻止程序阻止了。
尝试添加
window.open(url,'_blank');
好吧,我认为打开不是用户操作直接结果(即非异步)的页面时,您无法绕开弹出窗口阻止程序。
您可以尝试执行以下操作,它看起来像是弹出窗口阻止程序的用户操作:
var $a = $('<a>', { href: url, target: '_blank' }); $(document.body).append($a); $a.click();
看起来您最好保持事物同步。
只要新窗口是“相同来源”,您就可以使用JS进行操作。
$('#a').on('click', function(e){ e.preventDefault(); var wi = window.open('about:blank', '_blank'); setTimeout(function(){ // async wi.location.href = 'http://google.com'; }, 500); });