JS 模态对话框和非模态对话框操作技巧汇总


Posted in Javascript onApril 15, 2013

模态窗口 javascript 技巧汇总(传值、打开、刷新)
1、要弹出的页面中,一定要保证<head></head>标签间有<base target=“_self”>,否则会弹出的模态窗口上,点击按钮时,会再次弹出一个新页面。
2、被弹出页面的按钮的事件处理中,应该有Response.Write(new Function().ClosePage());语句,用以关闭当前的模态窗口。
3、因为幽默的缓存原因,如果你在模态窗口中修改了数据,你会发现,父页面上的数据刷新了,但是当你再点击按钮,重新弹出模态窗口时,你会发现模态窗口中的内容还是上次的内容,经过我试验,手动改了html代码后,点击弹出的模态窗口还是弹出相同的页面,所以,这里要绕开这个机制,方法是在被弹出的aspx页面后加上随机参数。上面模态窗口代码可以改成如下,以避免此问题:

public string ModalWindow(string openAspxPage,int width,int height) 
{ 
string js = string.Format("javascript:window.showModalDialog(\"{0}&rand="+new Random().Next().ToString()+ "\",window,\"status:false;dialogWidth:{1}px;dialogHeight:{2}px\")",openAspxPage,width,height); 
return js; 
}

注意红字部分参数,是自定义的一个参数,此参数应该是整个项目中唯一的变更名称,并且无意义(最保险的办法是把这个变更命名为lakjsdflawdfqwoifa之类的名称)。
基本上,满足了上述条件,做页面时就操作模态窗口,相对就简单了。
//-------------------------------------------------------------------------------------------------------------
模态窗口——有时会让你觉得很好用的一个东西
关于showModalDialog和showModelessDialog的使用,一个b/s结构的项目中用window.open弹出的窗口被一些广告拦截工具给拦截了,没办法就只能用showModalDialog来解决问题,但showModalDialog这个方法不好的就是页面间传值太麻烦(传值有两种方法),可是实在没其他的办法来解决这个拦截问题,只有用这个了。代码到是两下就写好了,但调试代码的时候发现一个问题,用showModalDialog弹出的窗口中的内容一直是第一次访问页面时显示的内容,开始就怀疑是窗体调用的页面缓存,最后通过单步跟踪调试也证明了问题确实是读取的页面缓存,这说明了在asp.net中用showModalDialog和showModelessDialog做弹出窗体时最好在page_load事件加上
Response.Expires = 0; 
Response.Cache.SetNoStore(); 
Response.AppendHeader("Pragma", "no-cache");

来清除缓存。用asp,php,js,vbscript测试使用showModalDialog方法没有出现需要清除缓存的情况,大家可以放心使用,关于showModalDialog的时候可以参见下面我找到的详细介绍
showModalDialog和showModelessDialog使用心得
一、showModalDialog和showModelessDialog有什么不同?

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

showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。:P)
二、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口?

在被打开的网页里加上<base target="_self">就可以了。这句话一般是放在<html>和<body>之间的。
三、怎样才刷新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会弹出新窗口的。
注意:如果想当访问的时候自动刷新,可以在被打开得页面,设置一个记录变量,当被打开模态窗口得时候,变量至1,然后使用上述方法刷新模态窗口,当关闭窗口得时候,变量至0.
四、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。

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

也要配合<base target="_self">,不然会打开一个新的IE窗口,然后再关掉的。
五、showModalDialog和showModelessDialog数据传递技巧。

例子:

现在需要在一个showModalDialog(或showModelessDialog)里读取或设置一个变量var_name

一般的传递方式:

window.showModalDialog("filename.htm",var_name)

//传递var_name变量

在showModalDialog(或showModelessDialog)读取和设置时:

alert(window.dialogArguments)//读取var_name变量

window.dialogArguments="oyiboy"//设置var_name变量

这种方式是可以满足的,但是当你想在操作var_name同时再操作第二个变理var_id时呢?就无法再进行操作了。这就是这种传递方式的局限性。


以下是我建议使用的传递方式:

window.showModalDialog("filename.htm",window)

//不管要操作什么变量,只直传递主窗口的window对象

在showModalDialog(或showModelessDialog)读取和设置时:

alert(window.dialogArguments.var_name)//读取var_name变量

window.dialogArguments.var_name="oyiboy"//设置var_name变量

同时我也可以操作var_id变量

alert(window.dialogArguments.var_id)//读取var_id变量

window.dialogArguments.var_id="001"//设置var_id变量

同样还可以对主窗口的任何对象进行操作,如form对象里的元素。

window.dialogArguments.form1.index1.value="这是在设置index1元素的值"
在弹出窗口中返回值:window.returnValue = ... ;
六、多个showModelessDialog的相互操作。

以下代码的主要作用是在一个showModelessDialog里移动别一个showModelessDialog的位置。

主文件的部份js代码。

var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px") //打开控制窗口

var s2=showModelessDialog('about:blank',window,"dialogTop:200px;dialogLeft:300px")

//打开被控制窗口

控制.htm的部份代码。

<script> 


//操作位置数据,因为窗口的位置数据是"xxxpx"方式的,所以需要这样的一个特殊操作函数。 
function countNumber(A_strNumber,A_strWhatdo) 
{ 
A_strNumber=A_strNumber.replace('px','') 
A_strNumber-=0 
switch(A_strWhatdo) 
{ 
case "-":A_strNumber-=10;break; 
case "+":A_strNumber+=10;break; 
} 
return A_strNumber + "px" 
} 

</script> 

<input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'-')" value="上移"> 

<input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'-')" value="左移"> 

<input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'+')" value="右移"> 

<input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'+')" value="下移">

以上关键部份是:

窗口命名方式:var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px")

变量访问方式:window.dialogArguments.s2.dialogTop

这个例子只是现实showModelessDialog与showModelessDialog之间的位置操作功能,通过这个原理,在showModelessDialog之间相互控制各自的显示页面,传递变量和数据等。这要看各位的发挥了。
====================================================================
window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框。
window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。
使用方法:
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])
参数说明:
sURL--必选参数,类型:字符串。用来指定对话框要显示的文档的URL。
vArguments--可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。
sFeatures-- 可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。
1.dialogHeight :对话框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默认的单位是em,而IE5以上是px,为方便其见,在定义modal方式的对话框时,用px做单位。
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。
下面几个属性是用在HTA中的,在一般的网页中一般不使用。
10.dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印预览时对话框是否隐藏。默认为no。
11.edge:{ sunken | raised }:指明对话框的边框样式。默认为raised。
12.unadorned:{ yes | no | 1 | 0 | on | off }:默认为no。

Javascript 相关文章推荐
密码框显示提示文字jquery示例
Aug 29 Javascript
浅谈JavaScript函数节流
Dec 09 Javascript
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
Jul 14 Javascript
微信小程序 地图map详解及简单实例
Jan 10 Javascript
jQuery实现弹窗居中效果类似alert()
Feb 27 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
SVG实现时钟效果
Jul 17 Javascript
js实现跟随鼠标移动的小球
Aug 26 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
Oct 26 Javascript
JavaScript享元模式原理与用法实例详解
Mar 09 Javascript
jquery获得页面元素的坐标值实现思路及代码
Apr 15 #Javascript
Extjs优化(二)Form表单提交通用实现
Apr 15 #Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
Apr 15 #Javascript
Extjs优化(一)删除冗余代码提高运行速度
Apr 15 #Javascript
Extjs Gird 支持中文拼音排序实现代码
Apr 15 #Javascript
jquery+css+ul模拟列表菜单具体实现思路
Apr 15 #Javascript
js作用域及作用域链概念理解及使用
Apr 15 #Javascript
You might like
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php获取图片信息的方法详解
2015/12/10 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python字符遍历的艺术
2008/09/06 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python文本数据相似度的度量
2018/03/12 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
python实现飞行棋游戏
2020/02/05 Python
pytorch进行上采样的种类实例
2020/02/18 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
学术会议通知范文
2015/04/15 职场文书
如何撰写创业策划书
2019/06/27 职场文书
聘任书的格式及模板
2019/10/28 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
深入浅析Django MTV模式
2021/09/04 Python
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS