最近项目中遇到很奇怪的一个现象,不知道各位以前有没遇到过, 就是在一个新打开的子窗口上使用了一个div遮罩, 但是问题来了,就是在父窗口上不断地点击超链接,则不断地弹出新的子窗口,也就是点了几下,则弹出几个新子窗口,但是在window.open中的name参数是一样的,按理是在父窗口上点击超链接,只是在第一次弹出的子窗口中不断地刷新页面。这让我很是困惑。
这是从http://www.w3school.com.cn网站上的一段关于window.open的描述。
事实上,在一般情况下也确实如此,但是这此的情况却有点特殊,请看代码:
mainWindow.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>mainwindow</title>
</head>
<body class="bodyBackground">
<a href="#" onclick='openWin()'>click it</a>
<script type="text/javascript" >
<!--
function openWin() {
window.open('childWindow.html', 'win', 'height=600, width=1000, toolbar=no,location=yes, menubar=no, resizable=yes,scrollbars=yes');
}
//-->
</script>
</body>
</html>
childWindow.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>childWindow</title>
<script src="Mask.js" type="text/javascript"></script>
</head>
<body class="bodyBackground">
<div id="test" style="border: 0pt none ; width: 500px; height: 500px; text-align: center;">
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
</div>
<input type="button" onclick="mask.mask();" value="open" />
<input type="button" onclick="mask.unmask()" value="close" />
</body>
</html>
最后是Mask.js:
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
//mask class
var Mask = Class.create();
Mask.prototype = {
maskDiv: document.createElement("div"),
maskComponent: null,
initialize: function() {
document.body.appendChild(this.maskDiv);
},
init : function(maskComponentId, showMsg) {
this.maskComponent = document.getElementById(maskComponentId);
this.maskDivId = this.maskDiv.id = 'maskDiv';
this.maskDiv.innerHTML = showMsg;
/*
var styles = {
"border": "1px solid gray",
"position": "absolute",
"height": this.maskComponent.offsetHeight + 'px',
"width": this.maskComponent.offsetWidth + 'px',
"top": this.getTop(this.maskComponent) + 'px',
"left": this.getLeft(this.maskComponent) + 'px',
"backgroundColor": "gray",
"color": "white",
"fontSize": "24px",
"fontFamily": "Aria",
"fontWeight": "bold",
"indexZ": 999,
"textAlign": "center",
"verticalAlign": "middle",
"display": "none"
}
for (name in styles)
this.maskDiv.style[name] = styles[name];
*/
this.maskDiv.style["border"] = "1px solid gray";
this.maskDiv.style["position"] = "absolute";
this.maskDiv.style["height"] = this.maskComponent.offsetHeight + 'px';
this.maskDiv.style["width"] = this.maskComponent.offsetWidth + 'px';
this.maskDiv.style["top"] = this.getTop(this.maskComponent) + 'px';
this.maskDiv.style["left"] = this.getLeft(this.maskComponent) + 'px';
this.maskDiv.style["backgroundColor"] = "gray";
this.maskDiv.style["color"] = "white";
this.maskDiv.style["fontSize"] = "24px";
this.maskDiv.style["fontFamily"] = "Aria";
this.maskDiv.style["fontWeight"] = "bold";
this.maskDiv.style["indexZ"] = 999;
this.maskDiv.style["textAlign"] = "center";
this.maskDiv.style["verticalAlign"] = "middle";
this.maskDiv.style["display"] = "none";
//this.setOpacity(this.maskDivId, 0.5);
},
mask: function(){
this.maskDiv.style["height"] = this.maskComponent.offsetHeight + 'px';
this.maskDiv.style["width"] = this.maskComponent.offsetWidth + 'px';
this.maskDiv.style["top"] = this.getTop(this.maskComponent) + 'px';
this.maskDiv.style["left"] = this.getLeft(this.maskComponent) + 'px';
this.maskDiv.style["display"] = "block";
},
unmask: function() {
this.maskDiv.style["display"] = "none";
},
getTop: function(e){
var offset=e.offsetTop;
if(e.offsetParent!=null) offset+=this.getTop(e.offsetParent);
return offset;
},
getLeft: function(e){
var offset=e.offsetLeft;
if(e.offsetParent!=null) offset+=this.getLeft(e.offsetParent);
return offset;
}
}
var mask = null;
function init() {
mask = new Mask();
mask.init('test', 'Loading...');
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = init;
} else {
window.onload = function() {
oldonload();
init();
}
}
这样的情况下是完全正常的,不管在mainWindow.html上点击“click it”这个超链接多少次,他总是会在第一个弹出的子窗口刷新页面。我们也可以在子窗口的地址栏输入:javascript:alert(window.name) 进行查看,如下图:
window.name确实也为‘win’。
但是当我们把Mask.js中init方法改为如下:
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
//mask class
var Mask = Class.create();
Mask.prototype = {
maskDiv: document.createElement("div"),
maskComponent: null,
initialize: function() {
document.body.appendChild(this.maskDiv);
},
init : function(maskComponentId, showMsg) {
this.maskComponent = document.getElementById(maskComponentId);
this.maskDivId = this.maskDiv.id = 'maskDiv';
this.maskDiv.innerHTML = showMsg;
var styles = {
"border": "1px solid gray",
"position": "absolute",
"height": this.maskComponent.offsetHeight + 'px',
"width": this.maskComponent.offsetWidth + 'px',
"top": this.getTop(this.maskComponent) + 'px',
"left": this.getLeft(this.maskComponent) + 'px',
"backgroundColor": "gray",
"color": "white",
"fontSize": "24px",
"fontFamily": "Aria",
"fontWeight": "bold",
"indexZ": 999,
"textAlign": "center",
"verticalAlign": "middle",
"display": "none"
}
for (name in styles)
this.maskDiv.style[name] = styles[name];
/*
this.maskDiv.style["border"] = "1px solid gray";
this.maskDiv.style["position"] = "absolute";
this.maskDiv.style["height"] = this.maskComponent.offsetHeight + 'px';
this.maskDiv.style["width"] = this.maskComponent.offsetWidth + 'px';
this.maskDiv.style["top"] = this.getTop(this.maskComponent) + 'px';
this.maskDiv.style["left"] = this.getLeft(this.maskComponent) + 'px';
this.maskDiv.style["backgroundColor"] = "gray";
this.maskDiv.style["color"] = "white";
this.maskDiv.style["fontSize"] = "24px";
this.maskDiv.style["fontFamily"] = "Aria";
this.maskDiv.style["fontWeight"] = "bold";
this.maskDiv.style["indexZ"] = 999;
this.maskDiv.style["textAlign"] = "center";
this.maskDiv.style["verticalAlign"] = "middle";
this.maskDiv.style["display"] = "none";
//this.setOpacity(this.maskDivId, 0.5);
*/
},
mask: function(){
this.maskDiv.style["height"] = this.maskComponent.offsetHeight + 'px';
this.maskDiv.style["width"] = this.maskComponent.offsetWidth + 'px';
this.maskDiv.style["top"] = this.getTop(this.maskComponent) + 'px';
this.maskDiv.style["left"] = this.getLeft(this.maskComponent) + 'px';
this.maskDiv.style["display"] = "block";
},
unmask: function() {
this.maskDiv.style["display"] = "none";
},
getTop: function(e){
var offset=e.offsetTop;
if(e.offsetParent!=null) offset+=this.getTop(e.offsetParent);
return offset;
},
getLeft: function(e){
var offset=e.offsetLeft;
if(e.offsetParent!=null) offset+=this.getLeft(e.offsetParent);
return offset;
}
}
var mask = null;
function init() {
mask = new Mask();
mask.init('test', 'Loading...');
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = init;
} else {
window.onload = function() {
oldonload();
init();
}
}
问题就来了,我们不断地在mainWindow.html上点击‘click it’, 他会不断地跳出新的子窗口,于是我在每个子窗口的地址栏输入:javascript:alert(window.name) ,发现他们的window.name竟然都是一样的! 如下图:
希望哪位高手看到了不吝赐教,解除我的困惑。。 我并没觉得mask.js中的修改的代码哪里有问题。。只是一个是循环赋值,一个直接赋值罢了。。。真是百思不得其解。。
- 大小: 63.9 KB
- 大小: 36.6 KB
- 大小: 67.5 KB
分享到:
相关推荐
版本号为6.0.9191.1,WHQL(Windows Hardware Quality Labs)认证意味着该驱动已经通过了微软的质量验证,确保了其在Windows系统中的稳定性和兼容性。 在现代计算机系统中,音频驱动起着至关重要的作用。它负责将...
unzip-6.0-1.el6.x86_64.rpm
VC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版.zipVC++6.0中文版...
总的来说,unzip是Linux系统中不可或缺的工具之一,特别是在CentOS 7.4这样的企业环境中。了解和熟练掌握unzip的使用,不仅能够提升工作效率,也能更好地应对各种文件管理需求。通过本文的介绍,希望能帮助读者深入...
COMSOL.Multiphysics.6.0.318.Win.Linux.macOS-SSQ,不知道更新了啥,某雷下载的速度还可以。
当你解压ncurses-6.0.tar.gz后,会得到一个名为ncurses-6.0的目录,其中包含了源代码、文档、示例程序和配置脚本。要构建和安装ncurses库,通常需要执行以下步骤: 1. **配置**:使用`./configure`命令检查系统环境...
Realtek最新声卡驱动Realtek HD Audio Driver 6.0.1.8591 WHQL
Realtek High Definition Audio驱动版本:6.0.1.8485-更新日期:20180710公版驱动-2A_ASUS_1563198157.zip 公版驱动程序。 有选项,可以干掉麦克风的底噪! 噪音抑制:用于在录音时降低静态背景噪音 回声消除:...
福昕风腾PDF套件 6.0.4.0619 简体中文破解补丁
windows远程RDPWrap[6.0.6001.18000]配置文件 windows远程RDPWrap[6.0.6001.18000]配置文件 windows远程RDPWrap[6.0.6001.18000]配置文件 windows远程RDPWrap[6.0.6001.18000]配置文件 windows远程RDPWrap[6.0.6001....
zabbix-release-6.0-1.el7.noarch.rpm
BootCamp-6.0.6136.exe
惠普战66三代AMD版-驱动版本:6.0.9071.1-2A_HP_1617351336.exe 更新日期:2020-11-24
linux,CentOS系统下unzip的安装,安装命令 rpm -ivh example.rpm 安装包的版本为:unzip-6.0-5.el6.i686.rpm
手动安装readline-devel-6.0-4.el6.x86_64。完美解决报错:readline-devel-6.0-4.el6.x86_64: failure: Packages/readline-devel-6.0-4.el6.x86_64.rpm from c6-media
CentOS 7.6版本unzip rpm文件。系统为x86-64位的操作系统,文件是rpm文件,可以使用rpm -ivh命令直接安装。
破解 PhantomPDF.Business.6.0.2.0413. crack 安装后,用破解文件覆盖目标文件,即可。 原安装文件,请到官网自行下载。
VC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0.zipVC 6.0....
描述中的“cups 6.0 opensource print management source”进一步确认了这是CUPS 6.0的开放源代码,主要用于打印管理。CUPS通过提供一套标准化的接口和机制,使得打印机可以方便地集成到各种操作系统中,同时支持...
RDPWrap[6.0.6000.16386] 配置文件,下载直接替换即可使用 RDPWrap[6.0.6000.16386] 配置文件,下载直接替换即可使用 RDPWrap[6.0.6000.16386] 配置文件,下载直接替换即可使用 RDPWrap[6.0.6000.16386] 配置文件,...