Подтвердить что ты не робот

Как я могу узнать, был ли файл javascript уже включен в страницу верхнего уровня?

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

Поэтому я включаю его поверх.

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

Как я могу сделать объявление и сделать его актуальным, только если страница не содержит другого тега для этого script?

4b9b3361

Ответ 1

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

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

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

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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 с аргументом

Ответ 5

Как вы хотите включить javascript только на одной странице вашего сайта.
Если вы используете Asp.net(4.0), то это очень просто.
Просто добавьте следующий код

<script type="text/javascript" scr="filepath and name here"></script>

в ContentPlaceHolder страницы содержимого.

Ответ 6

@Shimmy Я натолкнулся на это через долгое время, но, возможно, он может быть полезен или, по крайней мере, поможет другим, кто приходит сзади. Чтобы проверить, загружен ли jquery, сделайте это

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script>

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

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

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

Ответ 7

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

static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath)
{
        foreach (Control ctrl in page.Header.Controls)
        {
            if (ctrl is HtmlLink)
            {
                if ((ctrl as HtmlLink).Href.ToLower().Contains(jsRelativePath.ToLower())) return;
            }
            if (ctrl is LiteralControl || ctrl is Literal)
            {
                if ((ctrl as ITextControl).Text.ToLower().Contains(jsRelativePath.ToLower())) return;
            }
            if (ctrl is HtmlControl)
            {
                if ((ctrl as HtmlControl).Attributes["src"] != null)
                    if ((ctrl as HtmlControl).Attributes["src"].ToLower().Contains(jsRelativePath.ToLower())) return;
            }
        }

        HtmlGenericControl Include = new HtmlGenericControl("script");
        Include.Attributes.Add("type", "text/javascript");
        Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath));
        page.Header.Controls.Add(Include);
    }