一、前言
最近在项目中需要新窗口打开一个第三方的页面,大家都知道,使用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. 关于cuda拷贝的速度测试

    由于没有使用profiler,仅仅通过简单的传输函数测试,如下测试了10000个点,1000000个点,100000000个点的速度: 均按时钟周期来计时,通过MAX调整数据 int main(){ ...

  2. 解决Android应用安装快完毕时提示签名冲突,android签名文件生成(转)

    最近开发了一个Android手机应用,自己用Eclipse调试安装没问题,使用其他人调试生成的bin下的apk就会出现问题,安装到最后提示"安装签名冲突"错误,想了一下估计是没有给 ...

  3. Warning: Static member accessed via instance reference

    Warning: Static member accessed via instance reference Shows references to static methods and fields ...

  4. springboot整合mybatis,redis,代码(三)

    一 说明 接着上篇讲述redis缓存配置的用法: 二 正文 首先要使用缓存就必须要开开启缓存,第二步是需要开redis-server 下载redis包之后,点击图中两个都可以开启redis 怎么看是否 ...

  5. google ---gson字符串数组用GSON解析然后用逗号隔开拼接,去掉最后一个逗号

    public static void main(String[] args) { String ss= "[{\"type\":\"0\",\&quo ...

  6. Redis学习笔记(1)—— NoSQL&Redis简介

    一.NoSQL概述 1.1 什么是NoSQL NoSQL(NoSQL = Not Only SQL),意指“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库. 1.2 为什么需要NoSQ ...

  7. freemarker 定义公共header

    <#--公共顶部--> <#macro header title="默认文字" keywords="默认文字" description=&qu ...

  8. 网络中常用的各种协议(针对TCP/IP协议组)

    网络层: ip协议->网络互连协议 用途:将多个包在网络中联系起来,传输数据包(不可靠传输),最基本功能就是寻址和分段功能,不提供端到端,路由到路由的确认,不提供重发和流量控制.是计算机网络能狗 ...

  9. Linux软件源apt 仓库 包 的概念

    概念介绍: 软件源是debian系的概念,把软件放在一个pool里面,用一条命令就可以自动从指定服务器下载并安装. 源列表是/etc/apt/sources.list,里面写了你所用的服务器地址 (其 ...

  10. Linux不同发型版本(Debian REHL)与软件包管理器(RPM dpkg)的概念

    Linux的发行版本可以大体分为两类: Linux发行版 = Linux内核(类Unix内核) + Linux软件管理(package manager) 一类是商业公司维护的发行版本,以著名的Red ...