Что произойдет, если вы используете тег <script>с одним и тем же атрибутом "src" несколько раз в одном документе HTML? - PullRequest
16 голосов
/ 07 октября 2009

Хотя я почти уверен, что ответ на этот вопрос будет зависеть от браузера, определяет ли какой-либо из браузеров поведение при использовании нескольких тегов с одинаковым атрибутом src?

Например ...

<script src="../js/foo.js"></script>
...

<!-- what happens here? -->
<script src="../js/foo.js"></script>

Причина, по которой я задаю этот вопрос в первую очередь, заключается в том, что в моем конкретном случае я использую частичные представления в приложении ASP.NET MVC, в котором используется JQuery. Все файлы JQuery JS включены в основной файл шаблона через теги сценария. Я бы предпочел добавить теги сценария в файлы частичного просмотра, чтобы в случае их использования вне контекста основного шаблона они автоматически включали все необходимые файлы JS и не полагались на другое представление или шаблон для их включения. Однако я определенно не хочу, чтобы файлы JS передавались клиенту несколько раз, или любые другие побочные эффекты, которые могут негативно повлиять на работу пользователя.

Сейчас я думаю, что большинство, если не все основные браузеры (FF, Safari, IE, Opera) будут кэшировать файл JS при первом его использовании, а затем при последующих тегах скрипта браузер будет использовать кэшированная копия, если она доступна, и если срок ее действия не истек. Однако поведение кэширования обычно можно изменить с помощью конфигурации браузера, поэтому не представляется слишком «безопасным» полагаться на любое поведение кэширования.

Должен ли я просто принять тот факт, что мои частичные представления будут зависеть от других шаблонов или представлений, включая соответствующие файлы JS?

Ответы [ 4 ]

11 голосов
/ 07 октября 2009

Даже если они кэшированы, у вас могут возникнуть проблемы, поскольку один и тот же код будет выполнен дважды. По крайней мере, это приведет к тому, что браузер займет больше времени, чем необходимо. И это может привести к ошибкам, так как большая часть кода JavaScript не написана для выполнения дважды. Например, он может дважды подключать одни и те же обработчики событий.

1 голос
/ 07 октября 2009

Не выводите теги скрипта прямо в ваши партиалы. Создать механизм регистрации файлов скриптов для последующего включения. Этот механизм может отвечать только за включение файлов один раз.

0 голосов
/ 08 октября 2009

Что происходит, так это то, что JavaScript подается в интерпретатор в момент его загрузки. В случае коллизии пространства имен только имя переменной заданной области действия доживает до выполнения. Обычно этот последний единственный процесс предотвращает возникновение проблем путем перезаписи функций, передаваемых в интерпретатор ранее. Проблема в том, что функция определяет область видимости переменных, и эти переменные могут быть другими функциями, которые представляют другие области имен переменных в пространстве. Это проблема, потому что если функции имеют одно и то же значение имени и включают в себя разные определения переменных, то может произойти утечка, когда переменные из функции подачи в интерпретатор рано выживают даже после перезаписи этой функции, что может привести к ожидаемым конфликтам пространства имен. *

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

0 голосов
/ 07 октября 2009

FF 3.5x, Chrome 4x включает его только один раз.

:) В IE 8 есть две копии (см. Вкладку «Инструменты разработчика> вкладка« Сценарии »» с двумя записями jquery-1.3.2.min.js)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...