一、前言
最近在项目中需要新窗口打开一个第三方的页面,大家都知道,使用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. go语言实战教程之管理员查询功能、退出功能

    前面第10节课内容中已经学习开发完成了管理员登陆功能.本节课我们将继续学习开发完成管理员信息查询功能.管理员退出功能 管理员信息查询功能 请求及路由映射 管理员信息查询接口 接口名称:获取管理员信息. ...

  2. 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS

    [bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...

  3. 最长双回文串——manacehr

    题目 [题目描述] 顺序和逆序读起来完全一样的串叫做回文串.比如 acbca 是回文串,而 abc 不是(abc 的顺序为 “abc”,逆序为 “cba”,不相同).输入长度为 n 的串 S,求 S  ...

  4. uoj#450. 【集训队作业2018】复读机(单位根反演)

    题面 传送门 题解 我的生成函数和单位根反演的芝士都一塌糊涂啊-- \(d=1\),答案就是\(k^n\)(因为这里\(k\)个复读机互不相同,就是说有标号) \(d=2\),我们考虑复读机的生成函数 ...

  5. linux进程切换问题

    #define switch_to(prev,next,last) do { \ unsigned long esi,edi; \ asm volatile("pushfl\n\t" ...

  6. kindedtor的基本使用

    首先需要进入官网下载kineditor相关文件: 然后写代码: <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  7. 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比

    算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  要找出那些数相加等 ...

  8. UVA1714 Keyboarding

    传送门 坑很多的一题 这里要感谢crk大佬提前帮我把所有的坑都踩了一遍...233 讲一下题目的意思: 给你一个神奇的 r*c 的键盘 (r,c<=50) 上面有大写的字母,数字,' - '号 ...

  9. HDU计算机学院大学生程序设计竞赛(2015’12)Happy Value

    Problem Description In an apartment, there are N residents. The Internet Service Provider (ISP) want ...

  10. java读取配置到Hash表里

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; im ...