如何判断ASP.NET页面中是否已包含JavaScript文件?
我有一个ASP.NET用户控件(.ascx文件)。在这个用户控件中,我想使用一个.js文件 因此,我在页面上添加了如何判断ASP.NET页面中是否已包含JavaScript文件?,asp.net,javascript,html,script-tag,Asp.net,Javascript,Html,Script Tag,我有一个ASP.NET用户控件(.ascx文件)。在这个用户控件中,我想使用一个.js文件 因此,我在页面上添加了 但是,有时我在已经加载了相同脚本的网页中使用此用户控件 如何添加一个声明,该声明仅在页面不包含同一脚本的另一个标记时才会在页面上呈现?请使用以下内容: if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') { // code goes here var myObjectOrFunctionDecal
但是,有时我在已经加载了相同脚本的网页中使用此用户控件
如何添加一个
声明,该声明仅在页面不包含同一脚本的另一个
标记时才会在页面上呈现?请使用以下内容:
if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
// code goes here
var myObjectOrFunctionDecalredInThisScript = { };
}
this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
这将测试对象或函数是否已存在,从而防止重新声明。您可以在客户端执行以下两项操作之一
function requireOnce(url) {
if (!$("script[src='" + url + "']").length) {
$('head').append("<script type='text/javascript' src='" + url + "'></script>");
}
}
函数要求(url){
if(!$([script[src='“+url+']”)长度){
$('head')。追加(“”);
}
}
当您使用asp.net时,检查服务器端是有意义的,因为您将选择在服务器端添加对javascript文件的引用。从.ascx文件中,您可以注册以下内容:
if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
// code goes here
var myObjectOrFunctionDecalredInThisScript = { };
}
this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
。。。您只需从页面直接调用ClientScript对象:
ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
“GlobalUniqueKey”可以是任何字符串(我也使用javascript文件的url)
如果您尝试使用相同的键字符串注册脚本,则它不会执行任何操作。因此,如果您在页面、控件或其他任何地方调用此函数,那么您的页面中只会有一个引用。这样做的好处是,一个页面上可以有多个控件实例,即使它们都试图注册同一个脚本,但最多只能注册一次。他们都不必担心脚本已经注册了
有一个“IsClientScriptIncludeRegistered(stringkey)”方法,您可以使用该方法查看脚本是否已包含在该键下,但在注册之前执行该检查似乎是多余的,因为多次尝试注册不会引发异常或导致任何其他错误
执行客户端检查意味着,假设浏览器缓存了多个javascript引用(它们可能不是),您仍然有多个标记,每个标记的顶部都会导致一些javascript运行。如果一个页面上有20个控件实例,可能会出现严重问题
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;
} }
在主页中使用此函数,并调用函数include和参数javascript file name,因为您只想在站点的一个页面上包含javascript。
如果您使用Asp.net(4.0),则非常简单。
只需包含以下代码
<script type="text/javascript" scr="filepath and name here"></script>
在内容页的
ContentPlaceHolder
中。@Shimmy我在很长一段时间后遇到了这个问题,但也许它仍然有用,或者至少对后面的其他人有所帮助。要检查jquery是否已加载,请执行以下操作
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script>
window.jQuery | | document.write(“”)
不要错过document.write语句中结束脚本标记中的转义字符
@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 htmlLink)
{
if (htmlLink.Href.ToLower().Contains(jsRelativePath.ToLower())) return;
}
if (ctrl is ITextControl textControl
&& (textControl is LiteralControl || textControl is Literal))
{
if (textControl.Text.ToLower().Contains(jsRelativePath.ToLower())) return;
}
if (ctrl is HtmlControl htmlControl)
{
if (htmlControl.Attributes["src"]?.ToUpper()
.Contains(jsRelativePath.ToUpper())) return;
}
}
HtmlGenericControl Include = new HtmlGenericControl("script");
Include.Attributes.Add("type", "text/javascript");
Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath));
page.Header.Controls.Add(Include);
}
有什么原因不能在所有页面中都包含javascript库吗?jfar,我有一些网站,当我显示一个特定的控件时,在一个特定的页面上只需要一个javascript文件,大多数情况下,该控件在该页面上根本不会被使用。将javascript包含到每个访问过该页面的用户中是浪费的网站上的y页面,特别是如果他们的浏览器坚持在每次请求时都请求该文件。我不想在所有页面中包含该文件的原因是性能:我不需要在所有页面中都包含该文件。Neil,感谢您的解释。谢谢。我使用jQuery,这将是一件非常糟糕的事情。感谢所有回答者,我将来肯定会使用它们。一个问题是,如果jQuery本身就是我想要检查的脚本:)我不知道ASP,但是这看起来比我在客户端做的要好得多。根据你的回答,我基于我的基本页面布尔属性“AttachJqery”、“AttachAngine”等构建了它。这控制了附件,所以我不必被代码弄脏。我还可以选择设置默认值。如果有人需要示例,请在这里发表评论。太多的强制转换ctrl是HTMLINK,然后ctrl作为Html链接。考虑:var lnk=ctrl作为htmlink;如果按ctrl!=无效的节省演员阵容。