JavaScript子窗口ModalDialog中操作父窗口对像


Posted in Javascript onDecember 11, 2012

在ModalDialog中操作父窗口对象
1、不能使用window.parent
Window.parent是用来在frame中进行操作的,在对话框中不能用来操作父窗口对象

2、正确的做法
调用modaldialog时通过传参数的方式操作
例:
需求
父窗口页面为a.html 子窗口页面为b.html。a.html中有文本框id为test1,在打开的对话框中点击按钮,将a.html的文本框值改为“子窗口值”。
实现
打开对话框时把test1作为参数传给子窗口,在子窗口中获取参数,将参数对象(即a.html中传过来的text对象)的value属性值设置为“子窗口值”
注意:这里只能传id,不能传name
a.html代码如下

<html> 
<head> 
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 
<title>a.html</title> 
</head> 
<body> 
<input type=text id=test1 value=”> 
<input type=button value=” OK ” onclick='window.showModalDialog(“b.html”, test1)'> 
</body> 
</html>

b.html代码如下
<html> 
<head> 
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 
<title>b.html</title> 
<script language=javascript> 
function func1(){ 
//获取父窗口传过来的参数 
var ptextid = window.dialogArguments; 
if(ptextid != undefined){ 
//将父窗口传过来的对象的值改为“子窗口值” 
ptextid.value = ”子窗口值“; 
//关闭子窗口 
window.close(); 
} 
} 
</script> 
</head> 
<body> 
<input type=button value=” OK ” onclick=func1()> 
</body> 
</html>

如果需要操作的父窗口对象比较多,也可以将window或window.document作为参数传给子窗口。
例:
需求
a.html中添加id为“aform”的的form,form中有id为test2的文本框,在b.html中,除了进行上面的操作之外,还要将test2的值改为“子窗口值2”,并将form提交到c.html。
实现1
将a.html中打开对话框的函数改为如下方式:
window.showModalDialog(“b.html”, window.document);
将b.html中func1()改为如下:
function func1(){ 
var pdoc = window.dialogArguments; 
if(pdoc!=undefined){ 
pdoc.all.test1.value=”子窗口值“; 
pdoc.all.test2.value=”子窗口值2″; 
pdoc.all.aform.action=”c.html”; 
pdoc.all.aform.submit(); 
} 
}

实现2
因为在子窗口中对父窗口进行的操作比较多,也可以采用execScript的方式实现。
将a.html中打开对话框的函数改为如下方式:
window.showModalDialog(“b.html”, window);

添加javascript函数如下
function func(){ 
test1.value=”子窗口值“; 
document.all.test2.value=”子窗口值2″; 
aform.action=”c.html”; 
aform.submit(); 
}

将b.html中func1()改为如下:
function func1(){ 
var pwin = window.dialogArguments; 
if(pwin!=undefined){ 
var codeStr = ”func();” 
pwin.execScript(codeStr,”javascript”); 
window.close(); 
} 
}

showModalDialog和showModelessDialog使用心得-转载

一、showModalDialog和showModelessDialog有什么不同?
showModalDialog:被打开后就会始终保持输入焦点。除非对话框被关闭,否则用户无法切换到主窗口。类似alert的运行效果。
showModelessDialog:被打开后,用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。 )

二、怎样才让在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会弹出新窗口的。

四、如何用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元素的值“

六、多个showModelessDialog的相互操作
因为光说很费劲,我就偷点懒,直接用代码来说了,如果不明白的话那就直接来信(oyiboy#163.net(使用时请将#改成@))问我吧。
以下代码的主要作用是在一个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之间相互控制各自的显示页面,传递变量和数据等。这要看各位的发挥了
Javascript 相关文章推荐
jquery事件重复绑定的快速解决方法
Jan 03 Javascript
window.open()实现post传递参数
Mar 12 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
Sep 07 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 Javascript
Bootstrap轮播图的使用和理解4
Dec 14 Javascript
BootStrap与Select2使用小结
Feb 17 Javascript
Windows下Node爬虫神器Puppeteer安装记
Jan 09 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 Javascript
JavaScript获取URL参数的方法分享
Apr 07 Javascript
javascript中window.event事件用法详解
Dec 11 #Javascript
js 延迟加载 改变JS的位置加快网页加载速度
Dec 11 #Javascript
js控制CSS样式属性语法对照表
Dec 11 #Javascript
javascript向flash swf文件传递参数值注意细节
Dec 11 #Javascript
ajax的hide隐藏问题解决方法
Dec 11 #Javascript
ajax上传时参数提交不更新等相关问题
Dec 11 #Javascript
jQuery(非HTML5)可编辑表格实现代码
Dec 11 #Javascript
You might like
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
深入分析php之面向对象
2013/05/15 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
elementui的默认样式修改方法
2018/02/23 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
python求最大连续子数组的和
2018/07/07 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
中国文明网签名寄语
2014/01/18 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
交通安全月活动总结
2015/05/08 职场文书
2015年法务工作总结范文
2015/05/23 职场文书