在调移动支付问题的时候遇到过,用window.open打开一个微信支付链接,唤醒移动支付,在IOS下死活唤醒不了,是js代码冲突问题...是click事件IOS下不兼容问题...最后定位到window.open语句,之后改为window.loaction.href,奇迹般的可以唤醒支付,因此,也就很直观的证明了在Safari下用window.open是有问题的
原因:大部分现代的浏览器(Chrome/Firefox/IE 10+/Safari)都默认开启了阻止弹出窗口的策略,原因是window.open被广告商滥用,严重影响用户的使用。这个阻止弹出窗口的操作,并不是直接封杀window.open(),而是会根据用户的行为来判断这次window.open()是否属于流氓操作。
如果是由用户触发的动作所引起的 window.open 就不会被浏览器所阻止,比如写在 onclick 这些事件 handler 里的,但如果是代码自己触发的就会被阻止。
那么,我们可以知道,在Safari中无法open新窗口,原因是Safari的安全机制将其阻挡。
并不是所有地方都无法正常使用,在一些ajax或者jquery的getjson等回调代码中只要调用window.open都失效。原因是苹果的安全策略拦截。
解决办法有4种:
(1)用window.location.replace()来替代,【或者改变location.href,可以解决,缺点就是不是新开的窗口】
(2)苹果系统设置,偏好设置->安全性,去掉阻止弹窗的复选框就ok了。 【不建议,会改变用户的设置】
(3)在回到函数中生成一个链接,让用户再次点击下,因为链接是无论如何不会被拦截的。【不建议,多加了一个动作】
(4)在回调代码之前打开一个空窗口,例如 var w=window.open(xxx); 然后在回调函数中设置它的location。【推荐】
例如w.location=yyy; 具体分析和代码参考:
var openWin = function(){
var winRef = window.open("url","_blank");
$.ajax({
type: '',
url: '',
data: '',
......
success:function(json){
winRef.location = "新的url";
}
});
};
网友评论