天天看點

.NET Framework 2.0 中 SmartNavigation 的實作

   .NET Framework 2.0 中的 SmartNavigation和1.1中實作是一樣的,但有三個地方有變動:

第一個是增加了一個狀态參數"__smartNavPostBack",它由一個隐藏域來實作的,在attachForm到IFrame

__smartNav上的時候,動态插入到From中。他的狀态在 window.__smartNav.init

被置為了true(預設是false),但是這個狀态并沒有在整個Smart

Navigate的過程被使用,這個可能是給别的代碼使用的狀态,告訴别人這個頁面已經是被Smart Navigation控制了。

    第二個是增加了對CSS更新的更新,怎麼這麼繞口呢?這是因為如果CSS檔案是動态更新的,Smart Navigate也應該保證它能被更新到我們實際的那個document中去,而這個在1.1的實作中被M$忽略掉了。代碼是:

.NET Framework 2.0 中 SmartNavigation 的實作

        var ss = document.styleSheets;

.NET Framework 2.0 中 SmartNavigation 的實作

        for (var i = 0 ; i < ss.length; i++) {

.NET Framework 2.0 中 SmartNavigation 的實作

            ss[i].href = ss[i].href;

.NET Framework 2.0 中 SmartNavigation 的實作

        }

    原理和我們常用 document.location = document.location一樣了。

    第三個也是修複bug。1.1中對JScript更新的更新居然是采取的和更新CSS一樣的方法,代碼是:

.NET Framework 2.0 中 SmartNavigation 的實作

        var sc = document.scripts;

.NET Framework 2.0 中 SmartNavigation 的實作

        for (var i = 0; i < sc.length; i++)

.NET Framework 2.0 中 SmartNavigation 的實作

        {

.NET Framework 2.0 中 SmartNavigation 的實作

            sc[i].text = sc[i].text;

.NET Framework 2.0 中 SmartNavigation 的實作

這個方法在2.0中被更改了,而把CSS用這個方法來更新了。為什麼要這樣做呢?我覺得是腳本的優先級高吧,因為如果頁面依賴腳本,而腳本不能保證被更新,那麼這個頁面就什麼都幹不了,而CSS如果不能保證被更新,最多也就是顯示外觀有點問題。是以在2.0中,M$專門做了一個函數

window.__smartNav.loadScript 來更新Script,代碼是:

.NET Framework 2.0 中 SmartNavigation 的實作

    window.__smartNav.loadScript = function() {

.NET Framework 2.0 中 SmartNavigation 的實作

        var allScriptLoaded = true;

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

        for (var i = 0; i < sc.length; i++) {

.NET Framework 2.0 中 SmartNavigation 的實作

            if (sc[i].src != null && sc[i].src.length > 0) {

.NET Framework 2.0 中 SmartNavigation 的實作

                if (sc[i].readyState != 'loaded' && sc[i].readyState != 'complete' && sc[i].readyState != 'interactive') {

.NET Framework 2.0 中 SmartNavigation 的實作

                    allScriptLoaded = false;

.NET Framework 2.0 中 SmartNavigation 的實作

                }

.NET Framework 2.0 中 SmartNavigation 的實作

            }

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

        if (allScriptLoaded) {

.NET Framework 2.0 中 SmartNavigation 的實作

            for (var i = 0; i < sc.length; i++) {

.NET Framework 2.0 中 SmartNavigation 的實作

                sc[i].text = sc[i].text;

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

            if (typeof(window.onload) == "string")

.NET Framework 2.0 中 SmartNavigation 的實作

            {

.NET Framework 2.0 中 SmartNavigation 的實作

                try { eval(window.onload) } catch (e) {};

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

            else if (window.onload != null)

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

                try { window.onload() } catch (e) {};

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

        else {

.NET Framework 2.0 中 SmartNavigation 的實作

            setTimeout('window.__smartNav.loadScript();', 100);

.NET Framework 2.0 中 SmartNavigation 的實作
.NET Framework 2.0 中 SmartNavigation 的實作

    };

    這個函數是自觸發的,如果腳本裝載不能loaded、complete或interactive,它将以10Hz的頻率去反複嘗試。

    本來以為Framework 2.0的SmartNavigation能讓人有個驚喜,因為近來被Gmail的WebMail刺激了,結果還是有那麼一點點讓人失望。

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。