相信有不少朋友碰到过该问题,前些天我也遇到了,网上搜索了好久才找到一高人提供了一个优美的解决方案。
先说下问题是什么吧: 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. **兼容性**: `window.open()` 方法在大多数现代浏览器中都可用,包括 Chrome、Firefox、Safari 和 Edge 等。 2. **安全性**: 许多浏览器都增加了对弹出窗口的限制,以防止恶意弹出窗口干扰用户的浏览体验。因此,...
本文将详细解析`window.open()`的使用方法,并探讨在不同浏览器中的兼容性问题。 ### 1. 基本语法 `window.open()`的基本语法如下: ```javascript window.open(pageURL, name, parameters) ``` - `pageURL`:...
然而,直接在Ajax响应中使用`window.open()`方法可能会遇到浏览器的拦截问题。这是因为浏览器的安全策略通常会阻止非用户交互触发的新窗口打开,以防止恶意脚本滥用。本文将探讨这个问题的原因以及几种可能的解决...
在其他浏览器中,如Firefox、Chrome和Safari,可能需要使用其他方法,如`window.open()`,配合CSS和JavaScript来实现类似的效果。 - 模态对话框可能会对用户体验造成影响,因为它会阻塞用户的交互,因此在现代Web...
标题中的问题 "window.open的页面如何刷新(父页面)上层页面" 指的是如何在使用 `window.open` 创建的新窗口中执行 JavaScript 代码以刷新其父窗口。这个问题的解决方案已经在描述中给出,主要涉及以下 JavaScript ...
如果一个窗口不是由JavaScript打开的(比如用户手动在地址栏输入URL或通过书签访问),那么在Firefox、Chrome和Safari中,`window.close()`将不会有任何效果。 2. **`window.opener = null; window.close();`**: ...
当使用`window.location.hostname`或`window.location.assign()`等方式更改URL时,某些版本的IE(5.5+)会丢失referrer信息,而在Chrome 3.0+、Firefox 3.5、Opera 9.6和Safari 3.2.2中,referrer则能正常返回。...
对于Ajax异步请求,尽管其在后台完成了数据交互,但在用户看来并没有明显的交互行为,因此浏览器会阻止`window.open()`。 针对这种情况,有两种常见的解决方案: 1. **将异步请求改为同步请求**: 通过设置Ajax...
5. **兼容性**:`bWindow` 兼容主流的现代浏览器,包括Chrome、Firefox、Safari和Edge等,确保在多种环境下稳定运行。 **三、使用方法** 在项目中引入`bWindow`,可以通过npm或直接引入CDN链接。对于npm用户,可以...
然而,在某些情况下,你可能会遇到"FormData:FormData支持其中window.FormData未定义"的错误提示,这通常是由于浏览器不支持FormData,或者你的代码环境中没有正确地引入FormData导致的。 首先,我们要理解...
- **加载文件**:使用`window.open()`函数创建新窗口,并传递预览参数,如示例所示。`fileUrl`是待预览PDF的URL。 - **预览界面**:`viewer.html`是PDF.js内置的预览界面,它会解析并显示指定的PDF文件。 3. **...
然而,Firefox、Safari和Chrome则逐渐停止支持,它们的行为更接近`window.open`,可能不会阻止父窗口的交互,且返回值可能无效。Opera同样不支持此方法,可能导致没有对话框弹出或任何反应。 由于这种不一致性,...
在浏览器环境中,window既是JavaScript访问浏览器窗口的接口,也是ECMAScript规范中的Global对象。这意味着在全局作用域内定义的任何变量、对象和函数都默认属于window对象的属性和方法。例如,全局变量age和在...
在现代Web应用中,开发者经常需要引导用户在访问网页时打开已安装的应用或者引导他们下载应用。这个过程可以通过JavaScript实现,特别是在"JS判断是否安装APP"的场景下。以下是一些关于如何使用JavaScript来检测用户...
- **Safari浏览器**:通过`window.openDatabase`属性来判断是否为Safari浏览器。 4. **输出结果**:最后根据检测到的浏览器类型和版本,在页面上输出相关信息。 ##### 2.2 问题分析 1. **Safari浏览器版本检测**...
在现代Web开发中,全屏模式的实现是提升用户体验、增强网页沉浸感的重要技术之一。本文将深入探讨三种使用JavaScript实现的全屏模式方法,帮助开发者理解和应用这些技术,以适应不同场景的需求。 ### 一、调整窗口...
7. **模态和非模态窗口问题**:创建新窗口的`window.open()`方法在不同浏览器中的行为可能不同,尤其是在处理模态和非模态窗口时。需要检查并调整`features`参数以适应各种浏览器。 8. **Firefox与IE的...