SmartNavigation这个Page属性很有意思,他在不改动(其实是改动很小)页面元素布局的情况下,居然可以模拟出非常平滑的“无刷新”页面,为什么这个“无刷新”要阔起来呢?其实他是刷新了的,而且用的也不是什么xmlhttp也不是xmldom技术,它是事实在在的Submit,可能这样是为了浏览器兼容性什么的来考虑的吧。
    SmartNavigation的实现原理,其实和我们在动画绘制中使用的双缓冲技术及其相似。首先说一下他对普通页面的改造,他在普通的.aspx页面的返回结果中,加了两行代码,一个是IFrame,一个是JScript脚本:
...

None.gif<IFRAMEID="__hifSmartNav"NAME="__hifSmartNav"STYLE="display:none" src="/aspnet_client/system_web/1_1_4322/SmartNav.htm"></IFRAME>

...

None.gif<scriptlanguage="JScript"src="/aspnet_client/system_web/1_1_4322/SmartNav.js"></script>

...
    这中间的IFrame(__hifSmartNav)就相当于动画绘制中的实际绘图表面,在Smart Navigate中,他就是实际的Submit页面和数据接收页面。这一切都是SmartNav.js的杰作,SmartNav.js中使用了一个更有意思的技术,其实是老的不能再老的技术,用现代的话来说就是hook,说远点和Dos下修改中断向量有异曲同工之妙。它是怎么做的呢?其实除了显示输出,一切的操作都克隆到IFrame里去执行去了,因为IFrame对象,和Document对象有着最大的相似性,包括属性和事件等。
    当我们执行enable了SmartNavigation的页面时,它首先被SmartNav.js引导,这个脚本中最关键的一句就是:var rc = window.__smartNav.attachForm();,他的作用就是把我们当前页面上的form,包装到一个叫__smartNav的类中,然后用这个类来操作一切navigate。
    这是SmartNav.js中最关键最精彩的代码:

None.gifif(snfm.__formAttached==true)returntrue;
None.gif        snfm.__formAttached
=true;
None.gif        snfm.attachEvent(
"onsubmit", window.__smartNav.init);
None.gif        snfm._submit
=snfm.submit;
None.gif        snfm.submit
=window.__smartNav.submit;
None.gif        snfm.target
=window.__smartNav.hifName;

他完成了form的attach,同时hook了页面的submit事件,还在最后一句把__smartNav中form的target设定到了__hifSmartNav(这就是隐藏的那个IFrame)。如果不改变target,那么submit就把我们的当前form提交了wink_smile.gif
    说道这儿已经就没有什么好说得了,提交是__hifSmartNav执行的,返回的数据也回到了这个IFrame中,剩下的就是把获得数据写回到我们本来的那个document中去,那些代码比较的复杂,处理的情况也挺多,连标题的更新都是考虑到了的teeth_smile.gif,有兴趣就自己去读读罢。

转载于:https://www.cnblogs.com/birdshome/archive/2004/09/03/39115.html

.NET Framework 1.1 中 SmartNavigation 的实现相关推荐

  1. 使用 Microsoft .NET Framework 精简版中的 MessageWindow 类

     使用 Microsoft .NET Framework 精简版中的 MessageWindow 类 收藏 Alex Yakhnin IntelliProg, Inc. 2003年3月 适用于:    ...

  2. 在 .NET Compact Framework 2.0 中宿主 ActiveX 控件

    适用于: ActiveX Microsoft .NET Compact Framework 版本 2.0 摘要:了解如何在使用 .NET Compact 的应用程序中宿主 ActiveX 控件.本文提 ...

  3. 在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式

    [原文地址]Using Repository and Unit of Work patterns with Entity Framework 4.0  [原文发表日期] 16 June 09 04:0 ...

  4. Spring Framework 4.2 中的新功能和增强功能

    至今为止,Spring Framework 的最新版本为 4.2.1.RELEASE. 那么 Spring Framework 4.2 中的又有哪些新功能和增强功能呢? 核心容器改进 如 @bean ...

  5. NET Framework 2.0中的数据访问新特性

    1异步数据访问 a)支持异步数据编程 b)SqlConnection – BeginOpen – EndOpen  c)SqlCommand – BeginExecuteNonQuery – Begi ...

  6. Entity Framework 4.3 中的新特性

    原文地址:http://www.cnblogs.com/supercpp/archive/2012/02/20/2354751.html EF4.3于2月9号正式发布了,微软的EF小组最近一年开始发力 ...

  7. .NET Framework 3.5 中的功能简介(1)

    转自:Johnson(大可山)的Blog 我在前文<.NET Framework版本解析>中提到: .NET Framework 3.5 = .NET Framework 3.0 + .N ...

  8. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

  9. [召集] .NET Framework基本类库中的设计模式

    活动背景 现在研究设计模式的人很多,研究.NET设计模式的也不在少数.但大家的研究都是靠自己YY一个应用场景,然后写一些"样例"代码实现之.这离实际应用太遥远了. Anders L ...

最新文章

  1. 上云实践操作(漫步云端)之上云动力
  2. 说说PendingIntent的内部机制
  3. 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
  4. 2016年安全身份识别主流趋势
  5. 有重复数字的组合问题_带数字重复的组合和问题
  6. 服务器无法继续该事务 3400000006 错误原因--JAVA调用SQLSERVER存储过程时过程发生异常内部事务未
  7. 使用ros2d.js实现web端导航
  8. apple quicktime怎么在ppt中用_只添加一个色块,你也能做出高大上的PPT排版
  9. memcached—向memcached中保存Java实体需注意的问题
  10. 根据指定日期获取该日期所在周的所有日期
  11. HTML制作搞笑照片,美图秀秀怎么制作搞笑的GIF表情 搞笑的GIF表情在怎么制作
  12. SEO优化核心盘点,解谜、扫雷、权重提升统统在这
  13. 第五讲 中外数学名题趣题欣赏与解析
  14. 管理计算机找不到应用程序,电脑打开IE浏览器显示找不到应用程序如何解决
  15. 服务器winsxs文件夹怎么清理工具,win10系统winsxs文件夹该如何删除?win10删除winsxs文件夹的两种方法...
  16. 网络钓鱼仍然是安全行业的祸害
  17. 物流管理,快递单号查询查快递到哪了
  18. iphone用什么蓝牙耳机好?和iphone适配的蓝牙耳机推荐
  19. 基于Vue实现的网页音乐播放器
  20. 微软和NASA强强联手,重磅推出Python免费课程

热门文章

  1. apache2.2.21下为codeigniter配置url地址重写
  2. 东芝复印机2303出现f070_东芝复印机维修代码大全
  3. 13个免费创建和托管网站的在线工具[图]
  4. Hadoop HBase
  5. Matlab中的函数句柄@
  6. JAVA反射系列之Method,java.lang.reflect.Method的使用。
  7. 前台获取信息进行跳转
  8. 微软推出 Power Platform 漏洞奖励计划
  9. Citrix SD-WAN 被曝远程代码执行漏洞
  10. AttackerKB:免费的众筹漏洞评估知识库