在Ajax Client Framework的pageLoad事件執行動態加入的JavaScript程式

摘要:在Ajax Client Framework的pageLoad事件執行動態加入的JavaScript程式

在使用Microsoft AJAX Framework的時候,發現到如果使用動態註冊的JavaScript程式,會無法消除,

使用IE Developer工具的檢視原始碼中會看到其一直都存在,

另外一點,動態註冊的Startup的Javascript程式碼,會在網頁還沒完成載入的情況下即執行,

所以,我想要讓這些程式碼的執行時機往後延到pageLoad事件執行。

要做到這件事需要利用到Client Framework中的Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded來註冊pageLoad事件,

也可以利用名為pageLoad的函式讓Framework自動抓取,

我比較喜歡前者的方式,因為這樣可以讓pageLoad的函式給程式設計師使用,而不會佔走,

利用Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded註冊的事件程序所要做的事是執行動態加入的程式碼,

但是,加入的方法要如果加入?這一點,我以加入一個HTML標籤來解決,一開始打算用Hidden來做,不過用Hidden的話,

會讓網頁Post的時候資料量增加,所以最後我選用span來完成,

為了讓事件程序能夠得知其所要執行的程式碼在何處,需要一個識別號來識別程式碼的所在位置,

另外為了讓程式碼能正確無誤的讀取,所以我希望在註冊的時候能夠做些簡單的加密,

在Client端,JQuery提供了一個現成的Base64加密函式,剛好可以拿來使用,

這樣在pageLoad的事件程序上就可以將這個機制設計出來,

<script type="text/javascript">

    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(

       function(sender, evgs)

       {

           $("span[name='startup']").each(

              function(intIndex)

              {

                  var p = $.base64Decode($(this).html());

                  if (p != "")

                     eval(p);

              });

       });

</script>

這個區段我將其放在網頁的最後,確保Ajax Client Framework及JQuery都已經載入,

另外,我並不限定放置Script的span只能有一個,利用name來做識別對網頁所有符合的span都進行處理。

Client端的處置都完成了,

接下來就是在伺服端使用,利用一個變數將所有要執行的Javascript收集起來,

然後在Page_PreRender的事件中,轉成Base64字串放到span裡面,這樣就大功告成了。