2011-03-08 97 views
1

如果我就這樣在第一頁負荷增加一個客戶端腳本塊:我是否需要重新註冊客戶端腳本?

if (this.Page.IsPostBack==false) 
      { 
       if (this.Page.ClientScript 
          .IsClientScriptIncludeRegistered("ctlmyControl")==false) 
       { 
        string guidParamToHackBrowserCaching 
            = System.Guid.NewGuid().ToString(); 

this.Page.ClientScript.RegisterClientScriptInclude("ctlmyControl" 
         , ResolveUrl(String 
          .Format("~/clientScripts/ctlmyControl.js 
         ?par={0}",guidParamToHackBrowserCaching))); 
       } 
      } 

我需要所有後背上,重新註冊呢?

謝謝,

回答

2

如果腳本所在頁面的實際部分在回發後重新呈現,那麼是的。如果不是,那麼不,事實上,你不可以或它可以被複制。

更具體地說,如果您使用的是頁面使用部分回發,並呈現UpdatePanel需要註冊腳本代碼,那麼你不應重新註冊它除了在第一頁的負荷。另一方面,如果頁面在完全回傳或初始頁面加載時加載,那麼您必須註冊它。 ScriptManager將在部分回發中在UpdatePanel的動態內容區域外插入腳本,但它不會考慮在先前回發中可能已經呈現的現有腳本。 (這是否有道理?不是真的,但它是這樣的。)

如果是腳本沒有以任何方式持續存在,除非它們仍然存在於客戶端,部分頁面沒有重新加載。並且ScriptManager不做任何努力來記住已經在頁面的靜態部分中呈現的內容。因此,如果腳本將呈現的實際位置將在回發中得到更新(不管是異步還是完整),則需要重新註冊腳本,否則不要。

0

這取決於腳本的用途,但可能。回發時,瀏覽器中的舊DOM(包括任何腳本)被銷燬,並且您還在使用新的頁面實例。如果你仍然需要這個作爲頁面的一部分,那麼你需要確保它仍然是註冊的。

另一種方法是重構腳本使其更加靜態,這樣您需要的控件值就是傳遞給函數的參數。然後,您可以使用正常的<script標記,並且每次回發中唯一需要執行的操作是將控件的標識寫入可在調用該函數時使用的變量。

+0

如果它是一個異步調用服務器部分回發 - 我認爲腳本停留在browwser緩存。正確? – pencilCake 2011-03-08 15:34:02

+1

@burak - 是的,對於部分回發,瀏覽器中的DOM不會被銷燬,所以腳本仍然存在於客戶端。 – 2011-03-08 15:48:58

+0

..除非腳本實際呈現在更新的頁面部分。我非常肯定,如果你使用'RegisterStartupScript',它將在'UpdatePanel'區域,如果不是,它不會。所以你會想在部分回發後重新註冊一個啓動腳本(實際上這就是區別,因爲這樣的腳本實際上會在部分回發之後運行)。 – 2011-03-08 15:51:42

相關問題