2009-07-21 130 views
0

我想利用雅虎卓越性能的規則去除重複的腳本:avoiding duplicate script

要做到這一點我想就能知道是否一個腳本注入之前已經添加到頁面它在頁面中。它看起來像我不能確定後面添加的asp.net代碼,除非我有一個scriptmanager添加到頁面。但我想避免使用asp.net AJAX。從規則的描述來看,它看起來在php中是可能的。

假設我無法在我的代碼中執行檢查,我正在考慮使用jQuery $ .getString函數,但它在檢索腳本之前不檢查。如果我要選擇JavaScript文件,我是否必須解析整個http響應才能找出哪個腳本已加載到頁面上?

回答

2

如果頁面正在使用ASP.NET Page.ClientScript Register API註冊腳本,則可以使用Page.ClientScript.IsClientScriptIncludeRegistered。另一方面,如果您正在使用這些API,則您並不需要調用它,因爲它已確保每個API都只有一個已註冊。

http://msdn.microsoft.com/en/us/library/system.web.ui.clientscriptmanager.isclientscriptincluderegistered.aspx

如果頁面只是有定期OLE腳本元素靜態的標記,你需要的,如果一個腳本被加載在客戶端進行檢測,你將獲得頁面上的所有腳本元素並查看他們的.src值。與此相關的是,一些瀏覽器會自動將該網址解析爲完整路徑,而不僅僅是您聲明的路徑。所以,你可以用不同的方式對此進行解釋 - 你可以搜索字符串的結尾作爲你想要的腳本,或者你可以使你想要比較的url也可以通過設置爲動態創建來解決腳本元素(你永遠不會添加到DOM,但仍然爲你解決)。

這只是我的頭頂部,對不起,如果我得到的東西錯了:

var s = document.createElement("script"); 
s.src = "foo.js"; 

var loaded, scripts = document.getElementsByTagName("script"); 
for (var i = 0; i < scripts.length; i++) { 
    if (scripts[i].src === s.src) { 
     loaded = true; 
     break; 
    } 
} 
if (loaded) { 
    // this script is already loaded 
    // assuming you dont have multiple copies in different locations 
} 
+0

如果您正在努力改變您的腳本,包括使用JavaScript函數來管理重複項,那麼只需將它們更改爲使用像您最初建議的內置服務器端腳本管理器那樣更好。 – Alconja 2009-07-21 07:10:25

-1

是的,你必須分析整個響應...

你爲什麼不創建JavaScript文件,並把所有的JavaScript在那裏,然後在你的代碼中導入該JavaScript文件?這樣你就可以擺脫重複的腳本插入。

1

您不需要使用任何客戶端腳本來執行此操作......您可以在使用ClientScriptManager的代碼中執行此操作,而無需使用ASP.NET AJAX(我認爲您很困惑ClientScriptManager在你的控制/頁ScriptManager *)只需使用:

ClientScript.RegisterClientScriptInclude("some-script", "myScript.js"); 

或從您的用戶控件:

Page.ClientScript.RegisterClientScriptInclude("some-script", "myScript.js"); 

這將使用鍵「一些腳本」 &只能註冊的一個副本腳本在頁面上。

*要清楚,我覺得困惑從它們之間的區別arrising:

  • ClientScriptManager如果它是用來管理客戶端腳本(服務器端的輔助類,換句話說,它的全部目的就是做你正在做的事情)。它通過頁面的ClientScript屬性進行訪問。
  • ScriptManager是用於幫助客戶端Ajax腳本在ASP.NET AJAX

(地獄我甚至弄得自己&了最初的錯誤示例代碼)

0

以及一個控制是不會實際上在具有多個Web用戶控件的主細節場景中工作。

然後,如果Web用戶控件是動態的,那麼您無法控制誰必須執行腳本初始化。

鏈接一次更容易,但開發人員必須在ClientManager和使用腳本加載之間權衡他的選項。