如何判断JavaScript文件是否已包含在ASP.NET页面中?

时间:2009-05-25 23:59:52

标签: asp.net javascript html script-tag

我有一个ASP.NET用户控件(.ascx文件)。在这个用户控件中,我想使用.js文件。

所以我在页面上添加了<script src="file.js" type"text/javascript"></script>

但是,有时我会在已经加载了相同脚本的网页中使用此用户控件。

如果页面还没有包含同一脚本的另一个<script />标记,我该如何添加仅在页面上呈现的<script />声明?

7 个答案:

答案 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)

你可以做客户端的两件事之一......

  1. 检查dom以查找与您要检查的javascript文件相对应的脚本标记
  2. 测试您知道/将在javascript文件中定义的变量或函数是否为undefined。
  3. 这是一个快速的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)

@Shimmy很长一段时间我都会遇到这个问题,但也许它可能仍然有用,或者至少可以帮助其他人从后面来。要检查jquery是否已加载,请执行此操作

<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);    
}