Как я могу сказать, был ли файл JavaScript уже включен в ASP.NET Пейдж?


У меня есть ASP.NET пользовательский контроль (.файл ascx). В этот пользовательский элемент управления, я хочу использовать .файл js.

Поэтому я включаю <script src="file.js" type"text/javascript"></script> на странице.

Однако иногда я использую этот пользовательский элемент управления на веб-странице, где этот же скрипт уже загружен.

Как я могу добавить объявление <script />, которое будет отображаться на странице только в том случае, если страница уже не содержит другого тега <script /> для того же скрипта?

7 13

7 ответов:

Как вы используете asp.net, имеет смысл сделать проверку на стороне сервера, так как именно там вы решите добавить ссылку на файл javascript. От твоего .файл ascx можно зарегистрировать следующим образом:

this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

... со своей страницы вы просто вызываете объект ClientScript напрямую:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

"GlobalUniqueKey" может быть любой строкой (я использую url файла javascript для этого тоже)

Если вы попытаетесь зарегистрировать скрипт с той же ключевой строкой, это не сработает что-нибудь. Поэтому, если вы назовете это на своей странице, в своем элементе управления или где-либо еще, вы получите только одну ссылку на своей странице. Преимущество этого заключается в том, что вы можете иметь несколько экземпляров элемента управления на странице, и хотя все они пытаются зарегистрировать один и тот же сценарий, это делается только один раз. И никому из них не нужно беспокоиться о том, что сценарий уже зарегистрирован.

Существует метод' IsClientScriptIncludeRegistered(stringkey)', который можно использовать, чтобы увидеть, если сценарий уже был включен под этим ключом, но это кажется довольно избыточным, чтобы сделать эту проверку перед регистрацией, так как многократные попытки регистрации не вызывают исключений или каких-либо других ошибок.

Выполнение проверки на стороне клиента означает, что, предполагая, что несколько ссылок javascript кэшируются браузером (их может и не быть), у вас все еще есть несколько тегов и над головой каждого из них, вызывающих запуск некоторого javascript. Если бы у вас было 20 экземпляров вашего контроля на странице, вы могли бы стать серьезным проблемы.

Вы можете сделать одну из двух вещей на стороне клиента...

  1. Проверьте dom на наличие тега скрипта, соответствующего файлу javascript, который вы хотите проверить
  2. Проверьте переменную или функцию, которая, как вы знаете, была/будет определена в файле javascript для undefined.

Вот быстрая функция JS, которая использует JQuery, чтобы сделать то, что вам нужно:

function requireOnce(url) {    
    if (!$("script[src='" + url + "']").length) {
        $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    }
}

Используйте что-то вроде следующего:

if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
  // code goes here
  var myObjectOrFunctionDecalredInThisScript = { };
}

Это проверяет, существует ли уже ваш объект или функция, и таким образом предотвращает повторное объявление.

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>

Не пропустите escape-символ в теге закрывающего скрипта в документе.письменное заявление.

@mysomic, почему я не подумал об этом. большие пальцы вверх

PS: Я бы с удовольствием написал это прямо под строкой, где @Shimmy написал, что сам jQuery-это скрипт, который он хочет загрузить. Но не надо знаю, как это написать там. не могу увидеть ответ или что-нибудь подобное ссылку. Это может показаться глупым, но, возможно, я что-то упускаю. Пожалуйста, укажите на это, кто-нибудь?

Если вам это нужно со стороны сервера, и страница.ClientScript.RegisterClientScriptInclude не будет работать для вас, если сценарий был включен каким-либо другим способом, отличным от страницы.ClientScript.RegisterClientScript (например page.Заголовок.Контроли.Добавлять(..), вы можете использовать что-то вроде этого:

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