一、前言
最近在项目中需要新窗口打开一个第三方的页面,大家都知道,使用window.open打开新窗口某些情况下会被浏览器的屏蔽程序阻止。如果要打开的URL是通过AJAX获取的,就一定会被浏览器拦截。为了解决这个问题,温习了window.open的详细用法。记录下来备忘。
 
二、window.open有两个用途
(1)、导航到指定的URL
(2)、打开一个新窗口。该应用场景比较常见。
先看一个完整示例,打开招商银行大众版:
var cmbBankWin = window.open('https://pbsz.ebank.cmbchina.com/CmbBank_GenShell/UI/GenShellPC/Login/Login.aspx', 'newhb', 'menubar=no,toolbar=no,location=no,directories=no,scrollbars=yes,status=yes,resizable=yes');
三、参数说明
参数一、要加载的URL
参数二、窗口目标。在该名称的窗口或框架中加载第一个参数指定的URL。如果该参数指定的窗口不存在,则会按照第三个特性参数创建新窗口或者新标签页。如果没有第三个参数则创建默认窗口(工具栏、地址栏、状态栏)。
参数三、特性字符串。示例:height=400,width=400,top=10,left=10
参数四、新页面是否取代浏览器历史记录中当前加载页面的布尔值。只在不打开新窗口的情况下使用该参数。
 
四、第三个参数支持的特性值:
fullscreen 是否最大化打开。仅IE有效。
height
width
top
left
location 是否显示地址栏
scrollbars 内容在视口中显示不下,是否允许滚动
status 是否显示状态栏
toolbar 是否现在工具栏
menubar 是否显示菜单栏
resizable 是否可以通过拖拽浏览器边框改变窗口大小
 
五、操作打开的新窗口
cmbBankWin.resizeTo(500, 500);
cmbBankWin.moveTo(100, 100);
cmbBankWin.close() 该方法仅适用于通过window.open打开的新窗口,对于浏览器的主窗口,未得到用户允许不能关闭。
 
六、返回值说明
window.open会返回指向新窗口的引用
 
七、新窗口与原始窗口之间的引用关系
获取原始窗口的引用
cmbBankWin.opener
有些刘浏览器(IE8、chrome)会在独立的进程中运行新的标签页。如果一个标签页打开另一个标签页,如果两个window对象之间需要彼此通信,那么新开的标签页就不能在独立的进程中运行。在chrome中,将新创建的标签页的opener属性设置为null,即表示在单独的进程中运行新标签页。如:cmbBankWin.opener = null
 
八、安全限制
浏览器厂商为了让用户免受广告弹窗的骚扰,采取了以下措施:
不允许修改状态栏
不允许将弹出窗口移动到屏幕以外
不允许在屏幕之外创建弹出窗口
 
九、弹出窗口屏蔽程序
很多浏览器都有弹出窗口屏蔽程序,还有很多浏览器插件可以屏蔽弹出窗口,比如Yahoo!Toolbar
写一段检测弹出窗口被屏蔽的程序:
function isBlocked(){
var blocked = false;
try{
var cmbBankWin = window.open('https://pbsz.ebank.cmbchina.com/CmbBank_GenShell/UI/GenShellPC/Login/Login.aspx', 'newhb', 'menubar=no,toolbar=no,location=no,directories=no,scrollbars=yes,status=yes,resizable=yes');
if(cmbBankWin == null){
blocked = true;
}
}catch(ex){
blocked = true;
} return blocked;
}
 
十、如何绕过浏览器的屏蔽程序,顺利打开一个新窗口?
(1)、手动修改浏览器的安全级别:
不同的浏览器修改安全级别的方式不同,以下为chrome解除阻止的方式:
步骤一、
 
步骤二、
 
步骤三、
步骤四、

 
 
(2)、但是作为技术人员,我们需要通过脚本解决问题,而不是提示用户去修改自己的浏览器设置。以下措施是我们常用的方法:

1、动态创建A标签,取到URL后设置A标签的href属性,用脚本调用A标签的click事件。
2、动态创建Form表单,target属性设置为_blank,method属性为get。用脚本提交表单。注意通过这种方式打开的URL无法携带参数,传递参数需要通过隐藏域(input type='hidden')来做。代码如下:
function openNewWin (url) {
var r = document.documentElement;
var f = document.createElement("form");
f.target = "_blank";
f.method = "get";
setParams(url);
r.insertBefore(f, r.childNodes[0]);
f.action = url;
f.submit(); $(f).remove(); function setParams(url){
var paramsObj = $T.Url.getQueryObj(url);
var inputTemplate = '<input type="hidden" name="{0}" value="{1}" />';
for(var name in paramsObj){
if(paramsObj.hasOwnProperty(name)){
$(f).append($TextUtils.format(inputTemplate, [name, paramsObj[name]]));
}
}
}
}
3、通过以上两种方式,如果URL是通过AJAX获取的chrome浏览器仍然会阻止,IE8不会。可用以下方式解决:
步骤一、
先弹出新窗口
 
步骤二、
 AJAX返回地址后再改变新窗口的location.href属性
 
完整的代码示例如下:

var newWin = window.open('about:blank'); // 先弹出新窗口
var options = {};
options.success = function(url){
newWin.location.href = url; // AJAX返回地址后再改变新窗口的location.href属性
};
options.error = function(result){
console.log(result);
};
self.model.getUrl(options);// 异步获取URL地址

window.open方法解析的更多相关文章

  1. addLoadEvent方法解析

    onload方法在网页加载完毕时,会自动执行,但是该方法有个缺点就是只能执行一个方法. onload的限制 比如下面的代码: <script type="text/javascript ...

  2. 锋利的jQuery-4--$(document).ready()和window.onload方法的区别

    jQuery中的$(document).ready()和JavaScript中的window.onload方法主要有两个方面的不同: 1.执行时机: onload : 网页中所有的元素和元素的关联文件 ...

  3. $(document).Ready()方法 VS OnLoad事件 VS $(window).load()方法

    $(document).Ready()方法 VS OnLoad事件 VS $(window).load()方法接触JQuery一般最先学到的是何时启动事件.在曾经很长一段时间里,在页面载入后引发的事件 ...

  4. 网页性能管理详解:浅谈chrome-Timeline及window.requestAnimationFrame()方法

    你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个开发 ...

  5. jQUery中的$(document).ready()方法和window.onload()方法的区别

    1.常规的Javascript代码中,通常使用window.onload方法 window.onload = function(){//代码} 2.jquery中,则使用$(document).rea ...

  6. Javascript创建对象几种方法解析

    Javascript创建对象几种方法解析 Javascript面向对象编程一直是面试中的重点,将自己的理解整理如下,主要参考<Javascript高级程序设计 第三版>,欢迎批评指正. 通 ...

  7. Jquery中$(document).ready() 和 JavaScript中的window.onload方法 比较

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的.   1.执行时间 win ...

  8. $(document).ready()和window.onload方法

    引用:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload ...

  9. Python的方法解析顺序(MRO)[转]

    本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...

随机推荐

  1. sort排序bug乱序

    项目需要对组件的zIndex值进行降序排列,刚开始采用的是sort进行排序,排完之后感觉没问题,毕竟也是经常用的,可是昨天无意中把zIndex值打出来看,一看不知道,发现只要排序的组件超过10个就出问 ...

  2. unity网络延迟

    using UnityEngine; using System.Collections; public class Test_Ping : MonoBehaviour { public string ...

  3. 解密QQ号

    啊哈~ ---------------------------------------------------------- http://bbs.ahalei.com/thread-4489-1-1 ...

  4. winform按钮文字换行

    用button的Bounds属性 btn.Bounds = new Rectangle(new Point(5 + i * 143, 25), new Size(100, 60));

  5. Html再学

    1.  Html是网页的载体.内容就是网页制作者放在页面上想要用户浏览的信息,可以包括文字.图片.视频等. 2.  CSS样式是展现.就像网页的外衣.比如,标题字体.颜色变化,或为标题加入背景图片.边 ...

  6. java插入图片到数据库(可以批量)

    package sundun.zfpt.gg.web; import java.io.File; import java.io.FileInputStream; import java.sql.Con ...

  7. oracle随笔

    Oracle新建数据库(新用户) 1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 passwo ...

  8. visual studio检查运算上溢/下溢的开关位置

    [注意] 勾选这个选项会对应用程序的整体性能造成一些影响,但是会更加安全.具体情况根据项目需求来决定.

  9. Codeforces Beta Round #87 (Div. 2 Only)-Party(DFS找树的深度)

    A company has n employees numbered from 1 to n. Each employee either has no immediate manager or exa ...

  10. ajax加载菊花loading效果

    Ajax异步请求的时候,一般都会利用一个动态的gif小图片来制作一个Ajax Loading,以便增加用户体验. 这里我们可以使用Spin.js,该js脚本压缩后5k,可以不用任何图片,任何外部CSS ...