我有一个ASP.NET用户控件(.ascx文件)。在这个用户控件中,我想使用.js文件。
所以我在页面上添加了<script src="file.js" type"text/javascript"></script>
。
但是,有时我会在已经加载了相同脚本的网页中使用此用户控件。
如果页面还没有包含同一脚本的另一个<script />
标记,我该如何添加仅在页面上呈现的<script />
声明?
答案 0 :(得分:12)
当您使用asp.net时,检查服务器端是有意义的,因为这将是您选择添加对javascript文件的引用的位置。从.ascx文件中,您可以注册以下内容:
this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
...从您的页面直接调用ClientScript对象:
ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);
'GlobalUniqueKey'可以是任何字符串(我也使用javascript文件的url)
如果您尝试使用相同的键字符串注册脚本,则它不会执行任何操作。因此,如果您在自己的页面,控件或其他任何地方调用此选项,则最终只会在页面中显示一个引用。这样做的好处是,您可以在页面上拥有多个控件实例,即使它们都尝试注册相同的脚本,也只能执行最多一次。并且他们都不必担心脚本已经注册。
有一个'IsClientScriptIncludeRegistered(stringkey)'方法,您可以使用该方法查看该密钥是否已包含在该密钥下,但在注册多次尝试注册之前执行该检查似乎非常多余,不会抛出异常或导致任何其他错误。
执行检查客户端意味着,假设浏览器缓存了多个javascript引用(它们可能不是),您仍然有多个标记,每个标记的顶部都会导致一些javascript运行。如果您在页面上有20个控件实例,则可能会出现严重问题。
答案 1 :(得分:6)
你可以做客户端的两件事之一......
这是一个快速的JS函数,它使用JQuery来完成你需要的工作:
function requireOnce(url) {
if (!$("script[src='" + url + "']").length) {
$('head').append("<script type='text/javascript' src='" + url + "'></script>");
}
}
答案 2 :(得分:0)
使用以下内容:
if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
// code goes here
var myObjectOrFunctionDecalredInThisScript = { };
}
这将测试您的对象或功能是否已存在,从而阻止重新声明。
答案 3 :(得分: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文件名调用 include 函数
答案 4 :(得分:0)
由于您希望仅在您网站的某个页面上添加javascript 如果你使用Asp.net(4.0)那么它很容易 只需包含以下代码
即可<script type="text/javascript" scr="filepath and name here"></script>
在内容页面的ContentPlaceHolder
中。
答案 5 :(得分:0)
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script>
不要错过document.write语句中结束脚本标记中的转义字符。
@mysomic,为什么我没想到这一点。竖起大拇指
PS:我很乐意在@Shimmy写道jQuery本身就是他想要加载的脚本的行下写下这个。但不知道怎么写它。无法看到回复或任何类似的链接。这可能听起来很愚蠢,但也许我错过了一些东西。请指出,任何人?答案 6 :(得分:-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 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);
}