window.open方法解析

一、前言

最近在项目中需要新窗口打开一个第三方的页面,大家都知道,使用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方法解析,布布扣,bubuko.com

时间: 2024-08-09 19:47:29

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

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

你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个开发者,肯定不愿意看到这种情况,那么怎样才能提高性能呢? 本文将详细介绍性能问题的出现原因,以及解决方法. 一.网页生成的过程 要理解网页性能为什么不好,就要了解网页是怎么生成的. 网页的生成过程,大致可以分成五步. HTML代码转化成DOM CSS代码转化成CSSOM(CSS Object Model

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

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个(最后一个)       

activity生命周期中方法解析

对于activity的生命周期我觉得是一个简单而又不简单的问题,很多人可能觉得自己已经很精通了!往往事实却不以为然! 要接着讨论下面的问题,先来简单了解一下activity,来看一段原文的说明,如下: An activity is a single, focused thing that the user can do.  Almost all activities interact with the user, so the Activity class takes care of creat

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

$(document).Ready()方法 VS OnLoad事件 VS $(window).load()方法接触JQuery一般最先学到的是何时启动事件.在曾经很长一段时间里,在页面载入后引发的事件都被加载 在”Body”的Onload事件里.对于Body的Onload事件和JQuery的Ready方法相比,有很多弊端.比如:1.加载 多个函数的问题<body ></body>在Onload事件中 只能这样加载,很丑陋…而在JQuery中你可以利用多个JQuery.Ready()

addLoadEvent方法解析

onload方法在网页加载完毕时,会自动执行,但是该方法有个缺点就是只能执行一个方法. onload的限制 比如下面的代码: <script type="text/javascript"> function func1(){ console.log("this is func1()"); } function func2(){ console.log("this is func2()"); } window.onload = func

分享:APK高级保护方法解析(二)

F-Secure在2013下半年威胁研究报告中称,Android手机恶意软件占所有手机恶意软件的97%,比2012年的79%上升了18%,仅从这些数据来看,就知道Android用户的安全环境是多么糟糕.解决这些问题,需要开发者对自己的APK做好安全保护,防止被恶意篡改.二次打包及盗版. 下面小编就接着分享一下APK高级保护的第二种方法--文件夹混淆 文件夹混淆主要指的是利用Windows,Linux,Android 三个系统环境下的文件夹名的特殊性来对源码文件夹进行混淆,让混淆后的文件夹在Win

Javascript创建对象几种方法解析

Javascript创建对象几种方法解析 Javascript面向对象编程一直是面试中的重点,将自己的理解整理如下,主要参考<Javascript高级程序设计 第三版>,欢迎批评指正. 通过字面量形式,创建对象: var person_1 = { name: "userName", age: 20 } 工厂模式创建对象 通过一个构造函数接收参数的方式构造对象,可无数次调用这个函数,通过改变参数构造不同的对象 function createPerson(name,age){

清除浮动方法解析

清除浮动方法解析 清除浮动带来的额外影响 如果对于浮动不熟悉的同学,可以看看介绍float的文章.传送门:CSS float 我们知道,在一个父元素内如果遇到某个浮动元素,此时父元素的高度会发生塌陷.针对父元素高度塌陷的问题,现在已经有了很多的解决方案.针对每一个方案,我们来进行深度的剖析. 添加空块级元素 这种方法比较容易,但是要注意的是这个空元素必须是一个块级元素,不能是行内元素或者是行内块元素.缺点就是多了一些没有意义的标签.代码如下. //HTML <div class="cont

【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

作者 : 韩曙亮 转载请著名出处 :  http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期開始 : 进入 Idle (闲置) 状态; -- 生