.NET Framework SmartNavigation相關(guān)概念解析
.NET Framework SmartNavigation這個Page屬性很有意思,他在不改動(其實(shí)是改動很?。╉撁嬖夭季值那闆r下,居然可以模擬出非常平滑的“無刷新”頁面,為什么這個“無刷新”要闊起來呢?其實(shí)他是刷新了的,而且用的也不是什么xmlhttp也不是xmldom技術(shù),它是事實(shí)在在的Submit,可能這樣是為了瀏覽器兼容性什么的來考慮的吧。 #t#
SmartNavigation的實(shí)現(xiàn)原理,其實(shí)和我們在動畫繪制中使用的雙緩沖技術(shù)及其相似。首先說一下他對普通頁面的改造,他在普通的.aspx頁面的返回結(jié)果中,加了兩行代碼,一個是IFrame,一個是JScript腳本:
- < IFRAME ID="__hifSmartNav" 
NAME="__hifSmartNav" STYLE=
"display:none" - src="/aspnet_client/system_web/
1_1_4322/SmartNav.htm"> - < /IFRAME>
 - < script language="JScript" 
src="/aspnet_client/system_web/
1_1_4322/SmartNav.js"> - < /script>
 
這中間的IFrame(__hifSmartNav)就相當(dāng)于動畫繪制中的實(shí)際繪圖表面,在.NET Framework SmartNavigation中,他就是實(shí)際的Submit頁面和數(shù)據(jù)接收頁面。這一切都是SmartNav.js的杰作,SmartNav.js中使用了一個更有意思的技術(shù),其實(shí)是老的不能再老的技術(shù),用現(xiàn)代的話來說就是hook,說遠(yuǎn)點(diǎn)和Dos下修改中斷向量有異曲同工之妙。它是怎么做的呢?其實(shí)除了顯示輸出,一切的操作都克隆到IFrame里去執(zhí)行去了,因?yàn)镮Frame對象,和Document對象有著最大的相似性,包括屬性和事件等。
當(dāng)我們執(zhí)行enable了.NET Framework SmartNavigation的頁面時,它首先被SmartNav.js引導(dǎo),這個腳本中最關(guān)鍵的一句就是:var rc = window.__smartNav.attachForm();,他的作用就是把我們當(dāng)前頁面上的form,包裝到一個叫__smartNav的類中,然后用這個類來操作一切navigate。 
這是SmartNav.js中最關(guān)鍵最精彩的代碼:
- if (snfm.__formAttached ==
 
true) return true;- snfm.__formAttached = true;
 - snfm.attachEvent("onsubmit",
 
window.__smartNav.init);- snfmsnfm._submit = snfm.submit;
 - snfm.submit = window.__
 
smartNav.submit;- snfm.target = window.__
 
smartNav.hifName;
他完成了form的attach,同時hook了頁面的submit事件,還在最后一句把__smartNav中form的target設(shè)定到了__hifSmartNav(這就是隱藏的那個IFrame)。如果不改變target,那么submit就把我們的當(dāng)前form提交了。
.NET Framework SmartNavigation介紹到這兒已經(jīng)就沒有什么好說得了,提交是__hifSmartNav執(zhí)行的,返回的數(shù)據(jù)也回到了這個IFrame中,剩下的就是把獲得數(shù)據(jù)寫回到我們本來的那個document中去,那些代碼比較的復(fù)雜,處理的情況也挺多,連標(biāo)題的更新都是考慮到了的,有興趣就自己去讀讀罷。















 
 
 
 
 
 
 