早几天有人讨论了window.open()的事情,这样弹出的页面的确不是很友好,我在想能不能有这么一段javascript能将window.open()弹出一个iframe,不仅能方便的使用window.open()弹出窗口,而且在弹出的页面中可以通过window.opener访问父页面.
基础知识
1.open()方法:加入在页面中写一个方法function a(msg){alert(msg);},就可以通过window.a("msg")访问,如果函数名是alert,open,那么原来有的自带函数就会被"重写",这样的方法可以延伸到在弹出的页面访问父页面的方法:window.opener.a("msg");.open方法就这么诞生了
2.有上面你可能会想到window的 方法可以"重写",那么window的属性可不可以重新赋值呢?这个问题就难说了
3.arguments数组:在一个函数范围内可以通过该数组访问调用还函数的全部参数.如果一个函数只有一个参数而你带了两个参数,同样会调用这个方法(其实这就是javascript的多态了)
4.最简单的了:弹出一个iframe,首先在页面的body上"铺"一层背景层将整个body覆盖,然后在这个层上面放iframe
原生方法参数
window.open(url[,windowName][,features]);// returns the popWindow Object
主要的代码
window.open=function (url)//只有url参数
{
//parse featureas
var features=typeof(arguments[2])=="undefined"?"":arguments[2].toString();//获得第三个参数的方法
{
//parse featureas
var features=typeof(arguments[2])=="undefined"?"":arguments[2].toString();//获得第三个参数的方法
将featurs参数格式化成一个object
var featureArray=features.split(",");
var featureObject=new Object();
for(var i=0;i<featureArray.length;i++)
{
var array=featureArray[i].toString().split("=");
featureObject[array[0]]=array[1];
}
//featureObject.height
重写弹出窗口页面的方法和属性var featureObject=new Object();
for(var i=0;i<featureArray.length;i++)
{
var array=featureArray[i].toString().split("=");
featureObject[array[0]]=array[1];
}
//featureObject.height
var interval=null;
interval=window.setInterval(function (){
if(iframePop.document!=null)//循环直至找到iframePop.document
{
window.clearInterval(interval);
interval=null;
iframePop.close=function ()//rewrite iframePop.close But Only work in FF one Time!!
{
//iframe里面页面访问父页面 使用的是window.parent
iframePop.parent.closePop();
}
iframePop.opener=window;//DOES NOT WORK IN Firefox
}
},300);
这段代码有些奇怪,我也琢磨了很久,重写子窗口的方法一定要现获得子窗口的DOM结构,所以只能等子窗口加载完再说了,将iframePop.close写在循环外面就不起作用,这样在子窗口中调用close()时,他调用的是父页面的closePop()方法interval=window.setInterval(function (){
if(iframePop.document!=null)//循环直至找到iframePop.document
{
window.clearInterval(interval);
interval=null;
iframePop.close=function ()//rewrite iframePop.close But Only work in FF one Time!!
{
//iframe里面页面访问父页面 使用的是window.parent
iframePop.parent.closePop();
}
iframePop.opener=window;//DOES NOT WORK IN Firefox
}
},300);
注释也提到了,很遗憾,在FireFox中有些麻烦,将子窗口的opener属性设置为当前窗口时不起作用,这里有点不解,FireFox能让open这种方法给我们重写,设置opener为什么又那么小气了?难道这样设置的危险性还胜过重写open方法?所以最终在子窗口中只能使用window.parent访问父窗口了.
更奇怪的是重写close方法时,在FireFox只在第一次关闭时才可以,再次打开子窗口时可能子窗口被缓存了??
实例代码下载
仿照上面的思路,我还好好的整理了一下window.showModelessDialog
两个加上来应该能发首页了,下面是各位的意见了