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 相关文章推荐
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
Apr 02 Javascript
JS按位非(~)运算符与~~运算符的理解分析
Jul 31 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
Dec 04 Javascript
DIV始终居中的js代码
Feb 17 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 Javascript
jquery.multiselect多选下拉框实现代码
Nov 11 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 Javascript
Node.js实现文件上传的示例
Jun 28 Javascript
vue服务端渲染的实例代码
Aug 28 Javascript
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
node.JS二进制操作模块buffer对象使用方法详解
Feb 06 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
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
vue $mount 和 el的区别说明
2020/09/11 Javascript
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
python正则实现提取电话功能
2018/02/24 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
自我鉴定范文200字
2013/10/02 职场文书
小学母亲节活动方案
2014/03/14 职场文书
高中综合实践活动总结
2014/07/07 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle