摘要:在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裡面,這樣就大功告成了。