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

如何判断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

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

因此,我在页面上添加了

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


如何添加一个
声明,该声明仅在页面不包含同一脚本的另一个
标记时才会在页面上呈现?

请使用以下内容:

if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
  // code goes here
  var myObjectOrFunctionDecalredInThisScript = { };
}
this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

这将测试对象或函数是否已存在,从而防止重新声明。

您可以在客户端执行以下两项操作之一

  • 检查dom中与要检查的javascript文件对应的脚本标记
  • 测试javascript文件中已知已定义/将定义的变量或函数是否为未定义 下面是一个快速的JS函数,它使用JQuery执行您需要的操作:

    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!=无效的节省演员阵容。