удаление дубликата скрипта со страницы - PullRequest
0 голосов
/ 21 июля 2009

Я пытаюсь использовать правило исключительной производительности Yahoo: избегая дублирования скрипта

Для этого я хотел бы знать, был ли скрипт уже добавлен на страницу, прежде чем вводить его на страницу. Похоже, я не могу понять, что было добавлено в коде asp.net, если у меня нет скрипт-менеджера, добавленного на страницу. но я хотел бы избежать использования asp.net AJAX. Из описания правила, похоже, что это возможно в php.

Предполагая, что я не могу выполнить проверку в своем коде, я подумывал об использовании функции jQuery $ .getString, но она не проверяет перед загрузкой сценария. Если бы мне нужно было выбрать файл javascript, мне пришлось бы анализировать весь http-ответ, чтобы выяснить, какой скрипт был загружен на страницу?

Ответы [ 4 ]

2 голосов
/ 21 июля 2009

Если страница регистрирует сценарии с помощью API-интерфейсов регистра ASP.NET Page.ClientScript, вы можете использовать Page.ClientScript.IsClientScriptIncludeRegistered. С другой стороны, если вы используете эти API, вам не нужно вызывать его, поскольку он уже гарантирует, что только один из них зарегистрирован.

http://msdn.microsoft.com/en/us/library/system.web.ui.clientscriptmanager.isclientscriptincluderegistered.aspx

Если на странице просто есть обычные элементы ole-скрипта в разметке статически, и вам нужно определить, загружен ли скрипт на стороне клиента, вам нужно будет получить все элементы скрипта на странице и посмотреть их .src ценности. Дело в том, что некоторые браузеры автоматически преобразовывают этот URL в полный путь, а не только в тот, который вы объявили. Таким образом, вы можете объяснить это различными способами - вы можете просто найти конец строки, являющейся нужным вам сценарием, или вы можете также разрешить URL-адрес, с которым хотите сравнить, установив его в динамически создаваемый элемент script (который вы никогда не добавляете в DOM, но все еще разрешен для вас).

Это просто не в моей голове, извините, если я что-то не так:

var s = document.createElement("script");
s.src = "foo.js";

var loaded, scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
    if (scripts[i].src === s.src) {
        loaded = true;
        break;
    }
}
if (loaded) {
   // this script is already loaded
   // assuming you dont have multiple copies in different locations
}
1 голос
/ 21 июля 2009

Вам не нужно использовать какие-либо сценарии на стороне клиента, чтобы сделать это ... вы можете сделать это в своем коде с помощью ClientScriptManager без необходимости использовать ASP.NET AJAX (я думаю, вы путаете ClientScriptManager с ScriptManager *) в вашем элементе управления / странице просто используйте:

ClientScript.RegisterClientScriptInclude("some-script", "myScript.js");

или из ваших пользовательских элементов управления:

Page.ClientScript.RegisterClientScriptInclude("some-script", "myScript.js");

Это будет использовать ключ "some-script" и зарегистрировать только одну копию скрипта на странице.

* Для ясности, я думаю, что путаница возникает из-за разницы между ними:

  • ClientScriptManager если вспомогательный класс на стороне сервера, который используется для управления сценариями на стороне клиента (другими словами, вся его цель - делать именно то, что вы пытаетесь сделать). Доступ к нему осуществляется через свойство ClientScript страницы.
  • ScriptManager - это Элемент управления , используемый для поддержки сценариев Ajax на стороне клиента в ASP.NET AJAX

(черт возьми, я даже запутался и дал неправильный пример кода)

0 голосов
/ 17 сентября 2009

хорошо, что на самом деле не сработает в сценарии мастер-детализации с несколькими веб-элементами управления.

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

Проще связать один раз, но разработчику придется взвесить его параметры между ClientManager и использованием скриптовой загрузки.

0 голосов
/ 21 июля 2009

да, вы должны проанализировать весь ответ ...

почему бы вам не создать файл javascript и поместить туда весь свой javascript, а затем импортировать этот файл javascript в свой код ??? таким образом вы можете избавиться от вставки дубликата скрипта.

...