一、前言
最近在项目中需要新窗口打开一个第三方的页面,大家都知道,使用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. slice()、substring()、substr()的区别用法

    在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...

  2. Hyperledger Fabric java chaincode 编译部署(1.4V)

    前提条件: 构建好了一个拥有四个peer 一个Order 的1.4版本的Fabric网络. 证书通过Cryptogen生成,没有使用CA服务. 开启TLS. 网络中的peer都加入了一个 名为mych ...

  3. Java之批处理的实现

    批处理(batch) 一.批处理介绍 1. 批处理指的是一次操作中执行多条SQL语句 2. 批处理相比于一次一次执行效率会提高很多 3. 批处理主要是分两步: 1.将要执行的SQL语句保存 2.执行S ...

  4. 14.链表中倒数第k个节点

    题目描述:   输入一个链表,输出该链表中倒数第k个结点. 思路分析:   设置两个指针,一个fast一个slow,都从链表头开始,让fast先走k步,然后两个指针一起走,当fast走到尾部,那么sl ...

  5. 9.path Sum III(路径和 III)

    Level:   Easy 题目描述: You are given a binary tree in which each node contains an integer value. Find t ...

  6. 洛谷P2071 座位安排

    题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...

  7. springboot整合xxl-mq学习笔记

    首先xxl-mq是大神xuxueli开发的一个消息中间件框架: 与springboot整合过程: <?xml version="1.0" encoding="UTF ...

  8. springcloud系列10 整合Hystrix遇到的坑:

    首先配置类: @Bean public ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet ...

  9. 使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1

    我在RestTemplate的配置类里使用了 @LoadBalanced@Componentpublic class RestTemplateConfig { @Bean @LoadBalanced ...

  10. Qt 学习之路 2(13):对话框简介

    Qt 学习之路 2(13):对话框简介  豆子  2012年9月14日  Qt 学习之路 2  53条评论 对话框是 GUI 程序中不可或缺的组成部分.很多不能或者不适合放入主窗口的功能组件都必须放在 ...