博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET Framework 1.1 中 SmartNavigation 的实现
阅读量:6340 次
发布时间:2019-06-22

本文共 1537 字,大约阅读时间需要 5 分钟。

  SmartNavigation这个Page属性很有意思,他在不改动(其实是改动很小)页面元素布局的情况下,居然可以模拟出非常平滑的“无刷新”页面,为什么这个“无刷新”要阔起来呢?其实他是刷新了的,而且用的也不是什么xmlhttp也不是xmldom技术,它是事实在在的Submit,可能这样是为了浏览器兼容性什么的来考虑的吧。
    SmartNavigation的实现原理,其实和我们在动画绘制中使用的双缓冲技术及其相似。首先说一下他对普通页面的改造,他在普通的.aspx页面的返回结果中,加了两行代码,一个是IFrame,一个是JScript脚本:
...
None.gif
<
IFRAME 
ID
="__hifSmartNav" 
NAME
="__hifSmartNav" 
STYLE
="display:none"
       
src
="/aspnet_client/system_web/1_1_4322/SmartNav.htm"
></
IFRAME
>
...
None.gif
<
script 
language
="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.gif        
if (snfm.__formAttached == 
true
return 
true;
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,有兴趣就自己去读读罢。

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

你可能感兴趣的文章
269D Maximum Waterfall
查看>>
C++11 多线程
查看>>
关于MvcMusicStore购物车中移除功能不起作用
查看>>
统一项目管理平台(UMPlatForm.NET)-第3章 软件安装、配置、运行方法
查看>>
计算机网路知识的简单介绍
查看>>
sed-加速你在Linux的文件编辑
查看>>
HttpServer发送数据到kafka
查看>>
phpcms站---去除域名绑定目录中的HTML
查看>>
2017-5-3 打印控件、MDI 窗体容器
查看>>
20155303 2016-2017-2 《Java程序设计》第九周学习总结
查看>>
一次很失败的抄底
查看>>
数据结构C++(10)二叉树——链表实现(linkBinaryTree)
查看>>
利用Condition实现多线程交替执行
查看>>
里氏替换原则(设计模式原则2)
查看>>
lamp一键安装
查看>>
解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
查看>>
OpenCV——Haar-like特征
查看>>
C#时间/日期格式大全
查看>>
HttpWebResponse发送post请求并接收
查看>>
软件工程的理解及目标
查看>>