相信有不少朋友碰到过该问题,前些天我也遇到了,网上搜索了好久才找到一高人提供了一个优美的解决方案。

先说下问题是什么吧: safari 中没办法在回调函数里面执行window.open, 原因是safari的安全机制将其阻挡了(具体的原因可能需要你自己深入研究)..

那么如果你有这样的需求(或者类似的),通过ajax 发送请求到服务器端,等待请求响应成功之后,根据从服务器端响应得到的数据,打开一个窗口显示给用户,在safari上是没办法直接一个window.open搞定的( 浏览器没问题, IE, firefox, chrome).

那么window.open 在safari 中 只有当用户触发事件之后才能被调用成功的,怎么解决这个问题呢? 很简单, 绕过这个该死的安全机制,在你调用ajax请求之前,打开这个窗口, 然后在回调函数里面修改新打开窗口的location, 这样就解决了。这个解决方案是我前两天从国外一位兄台的博客上找到的,相信国内的某些兄弟可能会用到,所以在此发出来,希望能对你有所帮助。

简单示例代码如下(假设应用jquery):

var startNewWin = function(){

var winRef = window.open("", "_blank", "/*自己设置需要的属性参数*/");

$.ajax({

....

success:function(resp){

...

winRef.location = <你需要的location>;

}

});

}

这里还有个技巧,因为与后端交互可能有一定的时间的缘故,所以你可以在startNewWin 时打开一个modalDialog, jquery 的overlay很好用, 表示让用户等待, 相应结束后,在success 里面隐藏这个overlay,那么新的弹出窗口这个时候才会被弹出来。(如果用这个技巧的话,记得在修改新窗口的location的时候,包含在setTimeout里面延迟大概500-1000,因为你不这样做的话,你该路径的语句可能在窗口没打开之前就被执行了。。)


更多相关文章

  1. 如何使用智能管理员的注销警告弹出窗口来处理其他请求?
  2. Jquery:JS弹出窗口DIV层效果
  3. 在引导程序弹出窗口中使用交互式元素
  4. JQuery-Dialog(弹出窗口,遮蔽窗口)
  5. Twitter在模式窗口中引导数据表程序
  6. Symfony 2在用户站点上动态添加字段以形成
  7. Yii - 加载ajax表单元素的用户端验证
  8. EasyUI动态展示用户信息
  9. j2ee的web项目,有最终的html代码(即f12看到的最终给用户浏览器展示

随机推荐

  1. android 图片的 放大 缩小 移动
  2. 使用Vitamio打造自己的Android万能播放器
  3. android Handler 机制研究学习笔记
  4. Android原生(Native)C开发之二 framebuff
  5. android BaseAdapter优化
  6. Android中图片占用内存的计算
  7. Android 事件分发机制
  8. android中的sqlite数据库加密
  9. android source code online
  10. 在Android中使用Handler和Thread线程执行