IE的模态对话框里的问题还真是不少

博客介绍了模态对话框,如C#的MessageBox.Show和JavaScript的alert等,指出IE中showModalDialog方法存在诸多问题且已基本解决。还提到模态对话框不能用XMLHTTP对象获取服务器数据的问题,作者经尝试解决后不确定是否为bug,欢迎大家测试并讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    模态对话框(Modal Dialog),是一种会block顺序执行程序的窗口,比如C#里的MessageBox.Show(this,...),JavaScript里的alert(...)、confirm(...)等,是我们最常见的模态对话框。不关闭这种对话框程序的当前线程就被一直挂起了,这种窗口的特性最适合用来做条件分支的判断提示和Wizard窗口。

    在IE里面,我们可以通过window对象的showModalDialog方法十分方便的开启一个模态对话框。可是这个从IE4.0就开始支持的feature,居然还有一堆一堆的问题:( 比如:点超级链接或Submit按钮会开启新窗口啊,不能使用F5刷新啊,拿不到模态窗口的opener啊,等等。不过这些老问题绕来绕去都还算是被解决了。剩下的什么怎么在模态窗口间传出传入参数啊,怎么执行其opener里的方法啊,怎么关闭啊,就属于没有好好看msdn和对DHTML的不熟悉了。

    今天一不小心又发现一个模态对话框让人抓狂的问题,不能在里面使用XMLHTTP对象获取服务器数据,一调用就立刻返回空字符串。搞了半天找不到原因,于是啰里啰唆的把模态对话框的父窗口传到对话框内,把调用XMLHTTP对象的程序从模态窗口里原样移到父窗口里,从模态窗口去调父窗口里的方法,结果一下就取到服务器上的数据了emdgust.gif。到这里我还以为找到模态对话框的bug了,回家后决定把这个bug再研究一下,结果却很顺利的从模态窗口里调用XMLHTTP对象获得了服务器上的数据emangry.gif。真是郁闷!!!

    明天再找个机器来试试,看看到底还有没有问题。

    如果你对JS也感兴趣,不妨也来试验一下,看看到底是我机器环境本身的原因,还是这是一个不确定的bug。

    测试代码如下:

None.gif < html >
None.gif    
< head >
None.gif        
< title > Caller </ title >
None.gif    
</ head >
None.gif    
< body >
None.gif        
< button  onclick ="OpenDialog()" > Open Dialog
None.gif    
</ button >
ExpandedBlockStart.gifContractedBlock.gif        
< script  language ="javascript" > dot.gif
InBlock.gif        
function OpenDialog()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
var dlg = window.showModalDialog('Callee.htm');
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif        
</ script >
None.gif    
</ body >
None.gif
</ html >
None.gif

    存为:Caller.htm

None.gif < html >
None.gif    
< head >
None.gif        
< title > Callee </ title >
None.gif    
</ head >
None.gif    
< body >
None.gif        
< table  border ="0"  width ="100%"  height ="100%" >
None.gif            
< tr >
None.gif                
< td  align ="center"  valign ="middle" >
None.gif                    
< button  onclick ="GetData()"  ID ="Button1" > Open Dialog
None.gif                    
</ button ></ td >
None.gif            
</ tr >
None.gif        
</ table >
ExpandedBlockStart.gifContractedBlock.gif        
< script  language ="javascript" > dot.gif
InBlock.gif        
function GetData()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
var url = 'http://www.google.com';
InBlock.gif
            __XmlHttpPool__.GetRemoteData(url, alert);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif        
</ script >
ExpandedBlockStart.gifContractedBlock.gif        
< script  language ="javascript" > dot.gif
InBlock.gif        
var __XmlHttpPool__ =
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            m_MaxPoolLength : 
10,
InBlock.gif            m_XmlHttpPool : [],
InBlock.gif            
InBlock.gif            __requestObject : 
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
var xmlhttp = null;
InBlock.gif                
var pool = this.m_XmlHttpPool;
InBlock.gif                
for ( var i=0 ; i < pool.length ; ++i )
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if ( pool[i].readyState == 4 || pool[i].readyState == 0 )
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        xmlhttp 
= pool[i];
InBlock.gif                        
break;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif                
if ( xmlhttp == null )
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
return this.__extendPool();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
return xmlhttp;
ExpandedSubBlockEnd.gif            }
,
InBlock.gif            
InBlock.gif            __extendPool : 
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if ( this.m_XmlHttpPool.length < this.m_MaxPoolLength )
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
var xmlhttp = null;
InBlock.gif                    
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        xmlhttp 
= new ActiveXObject('MSXML2.XMLHTTP');
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
catch(e)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            xmlhttp 
= new ActiveXObject('Microsoft.XMLHTTP');
ExpandedSubBlockEnd.gif                        }

ExpandedSubBlockStart.gifContractedSubBlock.gif                        
catch(e2) dot.gif{}
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
if ( xmlhttp )
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
this.m_XmlHttpPool.push(xmlhttp);
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
return xmlhttp;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }
,
InBlock.gif            
InBlock.gif            GetRemoteData : 
function(url, callback)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this.__receiveRemoteData(url, callback, 'GET', null);
ExpandedSubBlockEnd.gif            }
,
InBlock.gif            
InBlock.gif            PostRemoteData : 
function(url, callback, data)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this.__receiveRemoteData(url, callback, 'POST');
ExpandedSubBlockEnd.gif            }
,
InBlock.gif            
InBlock.gif            __receiveRemoteData : 
function(url, callback, httpmethod, data)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
var xmlhttp = this.__requestObject();
InBlock.gif                
if ( !xmlhttp )
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
return null;
ExpandedSubBlockEnd.gif                }

InBlock.gif                xmlhttp.open(httpmethod, url, 
true);
InBlock.gif                xmlhttp.onreadystatechange 
= function()
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if ( xmlhttp.readyState == 4 || xmlhttp.readyState == 'complete' )
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        callback(xmlhttp.responseText);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }
;
InBlock.gif                xmlhttp.send(data);
InBlock.gif                
return xmlhttp;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }
;
ExpandedBlockEnd.gif        
</ script >
None.gif    
</ body >
None.gif
</ html > None.gif

    存为:Callee.htm 

    欢迎回复您的实验结果,同时也欢迎讨论模态窗口的其它问题及解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值