2009-05-25 40 views
12

我有一個用戶控件(ascx),在這個用戶控件中我想使用一個.js文件。如何知道JavaScript文件是否已包含在頂級頁面中?

所以我包含在它之上。

另一方面,有時候我會在網頁中使用這個用戶控件,該腳本之前已經加載了它。

只有在頁面不包含此腳本的其他標記時,我如何才能做出聲明並使其成爲實際聲明?

+0

是否有一個原因,你不能只包括在所有頁面的JavaScript庫 – jfar 2009-05-26 00:32:43

+4

jfar,我有一個永遠只需要一個JavaScript文件的網站?當我顯示一個特定的控件時,一個特定的頁面,大多數情況下,該控件在該頁面上根本不會被使用。將javascript提供給每個訪問網站上每個頁面的用戶都是浪費的,特別是如果他們的兄弟wser堅持要求每個請求文件。 – 2009-05-26 00:35:30

+1

我不想將它包含在所有頁面中的原因是性能:我不需要它們。 尼爾,謝謝你解釋。 – Shimmy 2009-05-26 01:01:46

回答

11

當你使用asp.net,是有意義的做檢查服務器端爲會在哪裏您選擇添加對JavaScript文件的引用。從您的.ascx文件,你可以用下面的註冊:

this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

...從你的頁面,你只需調用ClientScript對象直接:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

的「GlobalUniqueKey」可以是任何字符串(我使用JavaScript文件的url也是如此)

如果您嘗試使用相同的密鑰字符串註冊腳本,它不會執行任何操作。所以如果你在你的頁面,你的控件或其他任何地方調用這個函數,你的頁面中只有一個參考。這樣做的好處是,您可以在頁面上擁有多個控件實例,即使它們都嘗試註冊相同的腳本,但它最多隻能執行一次。他們都不需要擔心腳本已經註冊。

有一個'IsClientScriptIncludeRegistered(stringkey)'方法,您可以使用它來查看腳本是否已包含在該鍵下,但在註冊之前執行該檢查似乎相當冗餘,因爲多次嘗試註冊時不會拋出異常或導致任何其他錯誤。

檢查客戶端意味着,假設瀏覽器緩存了多個JavaScript引用(它們可能不是),那麼您仍然有多個標記,並且每個標記的頭部都會導致一些javascript運行。如果您在頁面上有20個控件實例,則可能會遇到嚴重問題。

+0

不知道ASP,但是這看起來比我做的客戶端更好的解決方案。 – mysomic 2009-05-26 00:52:33

+2

根據你的回答,我在我的基礎頁面上構建了布爾屬性「AttachJqery」,「AttachEngine」等。 這個控制attatchement,所以我不必弄髒代碼。 我也可以選擇設置默認值。 如果有任何需要的例子會很高興發佈,請在這裏留言。 – Shimmy 2009-06-14 01:43:34

0

使用類似如下:

if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') { 
    // code goes here 
    var myObjectOrFunctionDecalredInThisScript = { }; 
} 

此測試,如果你的對象或功能已經存在,從而防止重複聲明。

6

你可以做兩件事情的客戶端之一...

  1. 檢查對應的javascript腳本標籤的DOM文件,你要檢查
  2. 測試變量或函數,你知道了/將在javascript文件中定義爲undefined。

這裏是它用了jQuery做你需要一個快速的JS功能:

function requireOnce(url) {  
    if (!$("script[src='" + url + "']").length) { 
     $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    } 
} 
+0

謝謝。 我使用jQuery,這將是awsome。 謝謝所有回答者,我一定會在將來使用它們。 – Shimmy 2009-05-26 00:47:33

+3

一個問題是,如果jQuery本身是我想檢查的腳本:) – Shimmy 2009-06-14 01:40:48

0
var storePath = []; 
function include(path){ 
if(!storePath[path]){ 
    storePath[path]= true; 
    var e = document.createElement("script"); 
    e.src = path; 
    e.type = "text/javascript"; 
    document.getElementsByTagName("head")[0].appendChild(e); 
    return false; 
} } 

使用這個在您的主頁和呼叫功能包括與參數JavaScript文件名

0

當你想只包括您的網站的一個頁面上的JavaScript。
如果你使用Asp.net(4.0),那麼它很容易。
就包括以下內容頁ContentPlaceHolder代碼

<script type="text/javascript" scr="filepath and name here"></script> 

0

@Shimmy我很久之後就會遇到這個問題,但也許它可能仍然有用,或者至少可以幫助其他來自後面的人。要檢查是否jQuery是已經加載爲此

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script> 

不要錯過在文件撰寫聲明閉幕腳本標籤的轉義字符。

@mysomic,爲什麼我沒有想到這一點。大拇指

PS:我會喜歡在@Shimmy寫的那一行下面寫這個權利,jQuery本身就是他想加載的腳本。但不知道如何寫在那裏。不能看到回覆或任何類似的鏈接。這可能聽起來很愚蠢,但也許我錯過了一些東西。請指出,任何人?

-1

如果您在服務器端需要它,並且Page.ClientScript.RegisterClientScriptInclude在您的情況下無法正常工作,那麼腳本以其他方式包含在其他頁面中,則Page.ClientScript.RegisterClientScript(例如page.Header.Controls.Add (..),你可以使用這樣的事情:

static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath) 
{ 
     foreach (Control ctrl in page.Header.Controls) 
     { 
      if (ctrl is HtmlLink) 
      { 
       if ((ctrl as HtmlLink).Href.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is LiteralControl || ctrl is Literal) 
      { 
       if ((ctrl as ITextControl).Text.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is HtmlControl) 
      { 
       if ((ctrl as HtmlControl).Attributes["src"] != null) 
        if ((ctrl as HtmlControl).Attributes["src"].ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
     } 

     HtmlGenericControl Include = new HtmlGenericControl("script"); 
     Include.Attributes.Add("type", "text/javascript"); 
     Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath)); 
     page.Header.Controls.Add(Include); 
    } 
+0

太多投射ctrl是HtmlLink,然後按Ctrl鍵作爲Html鏈接。考慮:var lnk = ctrl作爲HtmlLink;如果ctrl!= null。保存演員。 – Roland 2016-04-25 18:00:51

相關問題