showModalDialog 打开的模态对话框有不少经典的缺陷,在这里不再冗述,我只谈谈最近碰到的几个问题以及解决办法。

问题1. showModalDialog 打开一个 aspx 页面时,如果该页面在之前已经打开过一次,则自动会加载缓存中的页面,而不能显示最新数据。

解决的办法有两种:

(1). 在打开模态框时,给 url 后面多加一个随机参数,来避免页面被缓存:

var url = 'EditFlowNode.aspx?flowId=0&id=2&x=' + Math.random();
var result = window.showModalDialog(url, '', 'status:no; help:no;');

(2). 在该 asp.net 页面的 Page_Load 方法里设定不缓存:

protected void Page_Load(object sender, EventArgs e){
    Response.Expires = 0;
    Response.Cache.SetNoStore();
    Response.AppendHeader("Pragma", "no-cache");
}

问题2. 模态对话框中的内容和脚本加载次序不同,导致的问题。

缘起:考虑如下页面的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>
  <title> new document </title>
  <meta name="generator" content="editplus" />
  <meta name="author" content="" />
  <meta name="keywords" content="" />
  <meta name="description" content="" />
 </head>

<body>      
    <input id="txt1">
    <script type="text/javascript">
    <!--
    alert(document.getElementById('txt1').offsetWidth);
    //-->
    </script>
 </body>
</html>

这个页面,如果在普通的 IE 窗口中加载时,提示的信息是 "155",而在模态对话框中执行时,其数值是 "0"。为什么会这样?

我们注意到普通窗口打开该页面时,当跳出 alert 对话框后,整个页面元素都已经正常显示了;而模态框在打开时,跳出 alert 对话框后,其背景却是一片空白;等点击“确定”后,才会显示出网页内容。
由此可以推测,模态框和普通页面在解析执行 HTML 时的次序不同:

普通页面:依次解析 body 中的元素,并随即绘制(render)解析完的元素。如果碰到 script, 则立刻执行之。

模态对话框:依次解析 body 中的元素,但并未立即绘制(render)它们。如果碰到 script, 则立刻执行之。等 body 都加载完毕后,再依次绘制其中的元素。

由于以上我们示例代码中访问到了 offsetWidth 属性,而我们可以推知,该属性一定是当元素被绘制(render)完毕后,才会自动计算出有意义的数值。所以就导致了问题中看到的现象。

之所以考虑到这个问题,其实是因为我在模态对话框中使用一个第三方控件的时候,出现了 bug,经过调试发现根源的原因在于该控件采用了常用的代码模式来输出其 HTML。也就是在一段 HTML 输出后,紧接着输出其初始化脚本。(这个问题值得 ASP.NET 控件开发者引起注意

幸运的是,我有这个控件的源代码。因此修改源代码解决了这个问题。我的解法类似于这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>
  <title> new document </title>
  <meta name="generator" content="editplus" />
  <meta name="author" content="" />
  <meta name="keywords" content="" />
  <meta name="description" content="" />
 </head>

<body>      
    <input id="txt1">
    <script type="text/javascript">
    <!--
    var _document_body_onload = document.body.onload;
    document.body.onload = function(){
        // 这里做你需要做的初始化动作
        alert(document.getElementById('txt1').offsetWidth);

if(_document_body_onload && typeof(_document_body_onload) == 'function')
            _document_body_onload();
    }
    //-->
    </script>
 </body>
</html>

关于 IE 模态对话框的两个问题相关推荐

  1. Qt中模态对话框和非模态对话框比较

    模态对话框的两种方式 1.窗口模态对话框:只能阻止与对话框关联(它的父窗口.所有祖父窗口,以及父窗口和父窗口的所有兄弟姐妹)的窗口的访问,允许用户在应用程序中继续使用其他窗口. 2.应用模态对话框:阻 ...

  2. 关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值

    当然网上关于这方面的技术博文非常多,此处我只是进行一下小记,再加一点自己的体会,方便以后查询. 一.模态对话框 1.创建及显示 模态对话框是一种阻塞式的对话框,即没有处理完该对话框,不能对其他地方进行 ...

  3. 变分模态分解_Android小部件示例中的模态对话框(弹出)

    变分模态分解 在此示例中,我们将看到如何在主屏幕中创建一个可以打开弹出对话框的Android小部件. 如您所知,Android Widgets是小型应用程序,基本上可以做两件事. 按下时启动新的活动, ...

  4. 鸡啄米:模态、非模态对话框

    模态对话框: (1)找到视图,添加一个"对话框"资源作为模态对话框(即:插入 Dialog(E)): (2)再给该模态对话框资源在添加类,类名为CTipDlg. 右键新加入的对话框 ...

  5. c#中的模态对话框和非模态对话框

    模态对话框 弹出窗口阻止调用窗口的所有消息响应. 只有在弹出窗口结束后调用窗口才能继续. 在模态窗口"关闭"后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态 ...

  6. PyQt4编程之模态与非模态对话框(一)

    模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应.如单击[确定]或[取消]按钮等将该对话框关闭.---- ...

  7. 【VS开发】模态对话框和非模态对话框

    MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程 ...

  8. 模态对话框和非模态对话框的消息循环分析

    1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...

  9. MFC中实现模态对话框的结构与原理

    1. 模态对话框 在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在子界面活动期间,父窗口是无法进行消息响应.独占用户输入 非模态对话框:各窗口之间不影响 模态框和非 ...

最新文章

  1. 这些Spring面试题,你都会了吗?
  2. 信息学奥赛一本通 1311:【例2.5】求逆序对 | 1237:求排列的逆序数 | OpenJudge NOI 2.4 7622:求排列的逆序数 | 洛谷 P1908 逆序对
  3. 随想录(一个android原生app的代码赏析)
  4. 山西省职业技能鉴定计算机操作员(中级工)理论知识试卷,山西省职业技能鉴定统一试卷 中级...
  5. php查询sql语句错误,Thinkphp3.2.3在SQL执行错误时查看SQL语句
  6. 山东计算机科学自考科目,山东自考本科专业考试科目(动画设计、电脑艺术、计算机、电子工程、)...
  7. 在线音乐播放地址//歌曲URL地址提取
  8. 你需要了解的JS框架 用途:构建数
  9. eclipse 重命名文件、移动文件、删除等操作时出现.svntmp文件
  10. Google 常用镜像收集
  11. google map 的地图偏移 火星坐标
  12. ps 的一些常见的键位技巧
  13. 06oracle视图与物化视图
  14. 什么是Promise?Promise的优点
  15. 赛马命运已成,微盟在劫难逃
  16. 网络炒作,幕后推手也应悠着点
  17. 【2022】软件著作权登记流程及费用
  18. 手写数学公式识别领域最新论文CAN代码梳理,以及用自己的数据集训练
  19. QGC地面站二次开发(一)地面站介绍以及软件框架(3)QGC汉化步骤介绍
  20. IB纪录(十八):At the heard of the image

热门文章

  1. 创建的Maven Web工程无法部署到服务器及web-app_2_3.dtd规范
  2. 将WORD文档中整篇文章的自动编号消除,但原序号不变
  3. 几行VB代码拿下注册表
  4. 李笑来登GitHub趋势榜第一,教你自学编程,含37%“硬核鸡汤”
  5. 突发!百度张亚勤退休
  6. 围观电动车极端测试,是一种怎样的体验?
  7. DeepMind和Unity合作,创建虚拟世界来训练AI
  8. 八家顶级无人车公司首次披露故障详情,从百度到Waymo
  9. 特斯拉车祸最新调查结果公布,“自动驾驶”Autopilot又双叒成主角
  10. display:table与本身的table的区别