一、前言
要打开一个可以载入页面的子窗口有三种方法,分别是window.open、window.showModalDialog和window.showModelessDialog。

open方法就是打开一个页面,可以说同用url链接打开一个页面一样,不推荐使用,因为很多浏览器会拦截。

这里推荐使用的是window.showModalDialog和window.showModelessDialog,下面介绍二者的异同和用法。

二、 showModalDialog和showModelessDialog的区别

showModalDialog:被打开后就会始终保持输入焦点,除非对话框被关闭,否则用户无法切换到父窗口,类似alert的运行效果。

showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响,最多是被挡住一下而以。

三、怎样才让在showModalDialog和showModelessDialog里的超连接不弹出新窗口

在默认情况下,showModalDialog和showModelessDialog窗口中的链接都会导致打开一个新的窗口,但这不是我们需要的。

解决这个问题的方法是在被showModalDialog和showModelessDialog窗口调用的页面添加<base target="_self" />

如下:

    <title>被打开的页面</title>

    <base target="_self" />

四.、showModalDialog和showModelessDialog不使用缓存

showModalDialog和showModelessDialog在第一次打开页面时会默认缓存该页面,如果再次打开相同URL的页面的话,他们会直接调用缓存中的页面,而不是从服务器返回,要不使用缓存可进行如下配置:

<title>被打开的页面</title>

<meta http-equiv="pragram" content="no-cache"> //禁止浏览器从本地缓存中调阅页面,网页不保存在缓存中,每次访问都刷新页面。

<meta http-equiv="cache-control" content="no-cache, must-revalidate">          //同上面意思差不多,必须重新加载页面

<meta http-equiv="expires" content="0">    //网页在缓存中的过期时间为0,一旦网页过期,必须从服务器上重新订

上面的配置不一定有效果,所以不推荐使用,最好的办法是在URL后加上一个时间戳,如下:

url = url + “&time=” + new Date();

五、如何刷新showModalDialog和showModelessDialog里的内容

在showModalDialog和showModelessDialog里是不能按F5刷新的,又不能弹出菜单。这个只能依靠javascript了,以下是相关代码:

<body onkeydown="if (event.keyCode==116){reload.click()}">

<a id="reload" href="filename.htm" style="display:none">reload...</a>

将filename.htm替换成网页的名字然后将它放到你打开的网页里,按F5就可以刷新了,注意,这个要配合<base target="_self">使用,不然你按下F5会弹出新窗口的。

由于在刷新上处理起来非常不方便,所以使用ajax结合showModalDialog和showModelessDialog使用是非常适合的,建议结合使用。

六、 用javascript关掉showModalDialog(或showModelessDialog)打开的窗口

<input type="button" value="关闭" onclick="window.close()">

也要配合<base target="_self">,不然会打开一个新的IE窗口,然后再关掉的。

七、 showModalDialog和showModelessDialog数据传递技巧(例子用的是showModalDialog函数,showModelessDialog函数的用法一样)

1)   父窗体向打开的窗体传递数据一般使用url参数传递

2)  打开的窗体,即子窗体向父窗体进行数据传递有两种方法

(1)    第一种称为“函数法”,同调用一个函数并返回值一样

可以通过在被调用的页面(子页面)使用window.returnValue来设置返回值,返回值可以是任何值或对象,调用页面(父页面)直接获取返回值即可。

//父窗体js,直接通过函数获取返回值

  1. function openModalWindow(){
  2. var returnValue = window.showModalDialog("sonPage.aspx");
  3. alert(returnValue);
  4. }

//子窗体js,通过window.returnvalue来设置返回值

  1. function setReturnFatherPageValue(){
  2. window.returnValue = true;
  3. }

(2)    第二种称为“引用法”,通过传递父窗体的引用,我们可以操作父窗体上的所有东西

要使用引用法就必须在打开子窗体时将父窗体作为一个参数传递给子窗体,而在子窗体可以通过window.dialogArguments获取到传递过来的父窗体的引用。

//父窗体js,将整个父window作为参数传递给子窗体

  1. function openModalWindow(){
  2. window.showModalDialog("sonPage.aspx", window);
  3. }

//子窗体js,通过window.dialogArguments可以访问父window中的所有元素,它在这里代表了父window对象

  1. function openModalWindow(){
  2. var txt = window.dialogArguments.document.getElementByIdx("txt");
  3. var lab = window.dialogArguments.document.getElementByIdx("lab");
  4. txt.value = "sonPageChangedValue";
  5. lab.value = "isTheSame";
  6. }

八、 控制弹出窗体的样式

1)       dialogHeight:   对话框高度,不小于100px

2)       dialogWidth:   对话框宽度。

3)       dialogLeft:    离屏幕左的距离。

4)       dialogTop:    离屏幕上的距离。

5)       center:  { yes | no | 1 | 0 } : 是否居中,默认yes,但仍可以指定高度和宽度。

6)       help: {yes | no | 1 | 0 }:      是否显示帮助按钮,默认yes。

7)       resizable:  {yes | no | 1 | 0 } [IE5+]:    是否可被改变大小。默认no。

8)       status:{yes | no | 1 | 0 } [IE5+]:是否显示状态栏。默认为yes[ Modeless]或no[Modal]。

9)       scroll:{ yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。

举例如下:

window.showModalDialog("sonPage.aspx", "",
"dialogHeight=350px;dialogwidth=410px;dialogLeft=0;dialogTop=25;help=no;resizable=no;status=no;scrollbars=no;");



window.showModalDialog("sonPage.aspx", window, "dialogHeight=350px;dialogwidth=500px;help=no;scrollbars=no;");

都可

九、  窗口高度自适应,这个需要在每个弹出框加载的页面放置,比较麻烦,而且不完善,使用时请调试好

  1. <script type="text/javascript">
  2. function resetDialogHeight(){
  3. if(window.dialogArguments == null){
  4. return; //忽略非模态窗口
  5. }
  6. var ua = navigator.userAgent;
  7. var height = document.body.offsetHeight;
  8. if(ua.lastIndexOf("MSIE 6.0") != -1){
  9. if(ua.lastIndexOf("Windows NT 5.1") != -1){    //alert("xp.ie6.0");
  10. window.dialogHeight=(height+102)+"px";
  11. }
  12. else if(ua.lastIndexOf("Windows NT 5.0") != -1){    //alert("w2k.ie6.0");
  13. window.dialogHeight=(height+49)+"px";
  14. }
  15. }
  16. else{
  17. window.dialogHeight=height+"px";
  18. }
  19. }
  20. </script>

然后如下设置即可:

<body onload="resetDialogHeight()">

window.open、window.showModalDialog和window.showModelessDialog 的区别[转]的更多相关文章

  1. WPF WebBrowser屏蔽弹出alert ,confirm ,prompt ,showModalDialog() ,window.open()

    WPF WebBrowser屏蔽弹出alert ,confirm ,prompt ,showModalDialog() ,window.open()添加Microsoft.mshtml.dll,然后写 ...

  2. window.showModalDialog 与window.open传递参数的不同?

    简单的说,就是一个在弹出窗口之后可以做其它的事,即window.open 另一个在弹出窗口之后不能做其它的事,只能是关闭了当前的窗口之后才能做其它的事,即window.showModalDialog ...

  3. window.showModalDialog与window.open()使用

    window.showModalDialog 有些浏览器不兼容,尝试用window.open() 封装替代,需要打开子窗口后向父窗口传递数据. <html> <script src= ...

  4. 2016/2/22 1、DOM的基本概念 2、Window对象操作 3、Windows.history对象 4、Window.location对象 5、Window.status对象

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方法: 属性(值或者子对象): op ...

  5. $(window).load(function() {})和$(document).ready(function(){})的区别

    JavaScript 中的以下代码 : Window.onload = function (){// 代码 }  等价于  Jquery 代码如下: $(window).load(function ( ...

  6. JavaScript中,window.opener是什么?window.parent和window.opener有啥区别?

    来自CSDN的问答: window.opener是什么啊? ++++++++++++++++++++++++++++++++++++++++++++++++++ 弹出本窗体的句柄 比如你想点一个按钮直 ...

  7. Sheet can not be presented because the view is not in a window的解决办法,和window的简单使用

    Sheet can not be presented because the view is not in a window,顺便在stackoverflow上找了答案,希望能给大家带来帮助,在此感谢 ...

  8. js关闭当前窗口,window.close()方法只能是window.open打开的才能执行关闭

    js关闭当前窗口,window.close()方法只能是window.open打开的才能执行关闭. function closeWin() { //open(location, '_self').cl ...

  9. 从一个例子了解window.onload、$(function(){})、$(window).load(function(){})的加载顺序

    最近遇到一个轮播需求: 1. ajax请求服务器,返回json,判断json数据里每一项中isFix属性是0还是1,0表示不轮播,1表示需要轮播. 2. 当isFix属性为0的时候,表示该图片不轮播, ...

随机推荐

  1. iOS - url中文和特殊字符转码###

    - (NSString *)generateUrl:(NSString *)url{ /** 第一个参数:NULL 第二个参数:C语言的字符串 第三个参数:NULL 第四个参数:要转义的字符串,不要乱 ...

  2. Laravel5.1 模型 --软删除

    软删除是比较实用的一种删除手段,比如说 你有一本账 有一笔记录你觉得不对给删了 过了几天发现不应该删除,这时候软删除的目的就实现了 你可以找到已经被删除的数据进行操作 可以是还原也可以是真正的删除. ...

  3. PHPthinking邀请您一起赚Money

    原文地址:http://bbs.phpthinking.com/thread-790-1-1.html 为了让大家工作或者学习之余.可以赚些money,PHPthinking为大家推荐一个赚钱的站点! ...

  4. iOS-ASIHTTPRequest框架学习

    本文转载至 http://www.cnblogs.com/A-Long-Way-Chris/p/3539679.html 前段时间在公司的产品中支持了够快网盘,用于云盘存储. 在这个过程中,学习到了很 ...

  5. 爬虫入门【8】Python连接MongoDB的用法简介

    MongoDB的连接和数据存取 MongoDB是一种跨平台,面向文档的NoSQL数据库,提供高性能,高可用性并且易于扩展. 包含数据库,集合,文档等几个重要概念. 我们在这里不介绍MongoDB的特点 ...

  6. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

  7. E QUERY [main] SyntaxError: identifier starts immediately after numeric literal mongodb mapReduce 异常分析 集合命名规范

    异常信息 repl_test:PRIMARY> db.0917order_totals_b.find()2018-09-28T15:13:03.992+0800 E QUERY [main] S ...

  8. Quality of service

    w https://en.wikipedia.org/wiki/Quality_of_service Quality of service (QoS) is the overall performan ...

  9. debug_backtrace final catch

    <?php function backtrace_str(){ $str = ''; $w = 0; $backtrace = debug_backtrace(); foreach($backt ...

  10. 详解jquery插件中(function ( $, window, document, undefined )的作用。

    1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ...