博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

window.open改造计

Posted on 2007-12-26 22:10  Hafeyang  阅读(8322)  评论(4编辑  收藏  举报

早几天有人讨论了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();//获得第三个参数的方法

将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 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()方法

注释也提到了,很遗憾,在FireFox中有些麻烦,将子窗口的opener属性设置为当前窗口时不起作用,这里有点不解,FireFox能让open这种方法给我们重写,设置opener为什么又那么小气了?难道这样设置的危险性还胜过重写open方法?所以最终在子窗口中只能使用window.parent访问父窗口了.
更奇怪的是重写close方法时,在FireFox只在第一次关闭时才可以,再次打开子窗口时可能子窗口被缓存了??

实例代码下载

仿照上面的思路,我还好好的整理了一下window.showModelessDialog
两个加上来应该能发首页了,下面是各位的意见了