项目使用ajax post后根据返回的success,需要打开一个新页面,使用window.open发现谷歌浏览器直接被拦截。
后来了解发现该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),
浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以也会被拦截。废话不多说,直接上终极解决办法
解决方法:
var newwin = window.open(); // 这句必须在ajax之前定义 $.ajax({ type: 'POST', url: '/do.php', dataType: 'json', error: function(){ newwin.close(); }, success: function(data){ newwin.location = data.url; } });
也没首页会打开一个空白页面随后跳转到返回的url上,期间时间间隔很短。如果异步请求执行快几乎没有啥影响。
经测谷歌/360浏览器正常。
网上很多人说改成同步syns。。其实没实际卵用,它必须响应时间极短才能见效,不信大家可以试试,但是上面的代码在微信上行不通
微信不支持window.open ,至少我的安卓微信上是无法通过window.open打开窗口的,但是可以通过self.location.href='new.html'打开。
总结:上面通过window.open开始就打开空白页,体验不好,对于ajax 页面跳转打开新窗口确实没啥好的办法,还要兼顾微信和手机浏览器的兼容性问题:
最终我直接改成页面跳转,解决微信和其他浏览器的兼容问题:目前各浏览器和微信上一切正常:
$(document).ready(function () { $.post("/do.php", { order_sn: "111111" }, function (data) { var data = eval("(" + data + ")"); if(data.tatus==1) self.location.href = "";// 跳转到新页 }); });