我有一個用戶控件(ascx),在這個用戶控件中我想使用一個.js文件。如何知道JavaScript文件是否已包含在頂級頁面中?
所以我包含在它之上。
另一方面,有時候我會在網頁中使用這個用戶控件,該腳本之前已經加載了它。
只有在頁面不包含此腳本的其他標記時,我如何才能做出聲明並使其成爲實際聲明?
我有一個用戶控件(ascx),在這個用戶控件中我想使用一個.js文件。如何知道JavaScript文件是否已包含在頂級頁面中?
所以我包含在它之上。
另一方面,有時候我會在網頁中使用這個用戶控件,該腳本之前已經加載了它。
只有在頁面不包含此腳本的其他標記時,我如何才能做出聲明並使其成爲實際聲明?
當你使用asp.net,是有意義的做檢查服務器端爲會在哪裏您選擇添加對JavaScript文件的引用。從您的.ascx文件,你可以用下面的註冊:
this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
...從你的頁面,你只需調用ClientScript對象直接:
ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
的「GlobalUniqueKey」可以是任何字符串(我使用JavaScript文件的url也是如此)
如果您嘗試使用相同的密鑰字符串註冊腳本,它不會執行任何操作。所以如果你在你的頁面,你的控件或其他任何地方調用這個函數,你的頁面中只有一個參考。這樣做的好處是,您可以在頁面上擁有多個控件實例,即使它們都嘗試註冊相同的腳本,但它最多隻能執行一次。他們都不需要擔心腳本已經註冊。
有一個'IsClientScriptIncludeRegistered(stringkey)'方法,您可以使用它來查看腳本是否已包含在該鍵下,但在註冊之前執行該檢查似乎相當冗餘,因爲多次嘗試註冊時不會拋出異常或導致任何其他錯誤。
檢查客戶端意味着,假設瀏覽器緩存了多個JavaScript引用(它們可能不是),那麼您仍然有多個標記,並且每個標記的頭部都會導致一些javascript運行。如果您在頁面上有20個控件實例,則可能會遇到嚴重問題。
使用類似如下:
if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
// code goes here
var myObjectOrFunctionDecalredInThisScript = { };
}
此測試,如果你的對象或功能已經存在,從而防止重複聲明。
你可以做兩件事情的客戶端之一...
這裏是它用了jQuery做你需要一個快速的JS功能:
function requireOnce(url) {
if (!$("script[src='" + url + "']").length) {
$('head').append("<script type='text/javascript' src='" + url + "'></script>");
}
}
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文件名
當你想只包括您的網站的一個頁面上的JavaScript。
如果你使用Asp.net(4.0),那麼它很容易。
就包括以下內容頁ContentPlaceHolder
代碼
<script type="text/javascript" scr="filepath and name here"></script>
。
@Shimmy我很久之後就會遇到這個問題,但也許它可能仍然有用,或者至少可以幫助其他來自後面的人。要檢查是否jQuery是已經加載爲此
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script>
不要錯過在文件撰寫聲明閉幕腳本標籤的轉義字符。
@mysomic,爲什麼我沒有想到這一點。大拇指
PS:我會喜歡在@Shimmy寫的那一行下面寫這個權利,jQuery本身就是他想加載的腳本。但不知道如何寫在那裏。不能看到回覆或任何類似的鏈接。這可能聽起來很愚蠢,但也許我錯過了一些東西。請指出,任何人?
如果您在服務器端需要它,並且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);
}
太多投射ctrl是HtmlLink,然後按Ctrl鍵作爲Html鏈接。考慮:var lnk = ctrl作爲HtmlLink;如果ctrl!= null。保存演員。 – Roland 2016-04-25 18:00:51
是否有一個原因,你不能只包括在所有頁面的JavaScript庫 – jfar 2009-05-26 00:32:43
jfar,我有一個永遠只需要一個JavaScript文件的網站?當我顯示一個特定的控件時,一個特定的頁面,大多數情況下,該控件在該頁面上根本不會被使用。將javascript提供給每個訪問網站上每個頁面的用戶都是浪費的,特別是如果他們的兄弟wser堅持要求每個請求文件。 – 2009-05-26 00:35:30
我不想將它包含在所有頁面中的原因是性能:我不需要它們。 尼爾,謝謝你解釋。 – Shimmy 2009-05-26 01:01:46