Почему вы используете document.location.protocol вместо простых // префиксных URL-адресов?


12

Например, Google Analytics использует document.location.protocol в шаблоне для отслеживания:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

вместо того

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = '//www.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

ССЛ. субдомен является немым аргументом, так как https://www.google-analytics.com/ga.js работает отлично.

Знание Google это скорее всего не упущение. Есть ли проблема с некоторыми браузерами, которые не поддерживают // протокол, поддерживающий сокращение, или я что-то упускаю?

РЕДАКТИРОВАТЬ: Это относится не только к Google Analytics (пример другого субдомена). То же самое появляется на странице API Font Loader :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';

Возможно, получит лучший ответ, перефразируя ваш вопрос, чтобы спросить о технической проблеме, а не о том, почему Google что-то делает. Вы не получите реальный ответ на второй вопрос (если мы не увидим здесь другой ответ Гуглера, что было бы здорово).
JasonBirch

Небольшое редактирование в попытке сделать его более независимым. Любые другие предложения?
Metalshark

Ответы:


3

В самом деле, это не был недосмотр команды GA!
Загрузчик GA загружает скрипт, поэтому на него не влияет ошибка двойной загрузки на <link>или @importдля таблиц стилей в IE7 / IE8.

Они используют условный (троичный) оператор document.location.protocol из-за ошибки в крайнем случае в IE6, из-за которой диалоговое окно безопасности появлялось при определенных настройках безопасности при запросе с субдомена не-'sss' , как объяснил Пол Ирриш (который работал вместе с ведущим разработчиком Google Analytics по этому вопросу) в своем блоге: https://www.paulirish.com/2010/the-protocol-relative-url/, из которого я цитирую ниже:
Изображение диалога безопасности безопасности IE6, источник: http://paulirish.com/i/7b01.png

2011.01.23: Но ... как насчет использования этого в фрагменте Google Analytics ?
Да, конечно, это было бы неплохо ... Поэтому я работал с ведущим разработчиком javascript в Google Analytics (Боже, мне нравится работать в Google), чтобы посмотреть, сможем ли мы это сделать ... Оказывается, мы не можем. В IE6 есть ошибка в пограничном регистре, из-за которой диалоговое окно взрывается ... при некоторых настройках безопасности (не уверены, являются ли они значениями по умолчанию) при запросе с субдомена не-'sss'. скриншот здесь . Поэтому не стесняйтесь брать 40 байтов из своего фрагмента GA, если вам не нужен IE6 ... в противном случае вам понадобится этот троичный оператор. `:)`
2011.12.24. Эрик Лоу (из команды IE) говорит о том, почему IE6 не очень хорошо играет ...
Причина, по которой это не работает в IE6, заключается в том, что сервер использует SNI для определения того, какой сертификат необходимо вернуть. XP (и, следовательно, IE6) не поддерживает SNI в стеке HTTPS . Смотрите подробности .


1

Вы уже указали на разницу в случае с Google Analytics, а именно в том, что https://ssl.вместо защищенной версии включена http://www.. Хотя безопасная версия www может работать, она также может отличаться от версии ssl:

  • Различные сертификаты для версии ssl и версии www.
  • Разный код для каждой версии.
  • Набор различных файлов cookie, специфичных для домена SSL.

Я не знаю, применимо ли это к Google. На первый взгляд код выглядел одинаково.


Другим примером может служить загрузчик шрифтов code.google.com/apis/webfonts/docs/webfont_loader.html, здесь нет различий в домене. Каждый пример их кода следует той же схеме.
Metalshark

В этом случае они используют один и тот же домен. Может быть, есть некоторые архаичные браузеры, которые не распознают //протокол?
Рассерженная шлюха

Это была мысль, но какие из них, что более важно, какие из них также поддерживают веб-шрифт? Позволяет ли оно более параллельное поведение (стиль квантовой физики, читая прото, изменяет состояние браузера)? Я тщательно проверил, и мне еще предстоит увидеть логику ...
Metalshark

0

Этот ответ о переполнении стека имеет несколько положительных моментов.

Было бы важно явно указать протокол, чтобы целевой ресурс был правильно загружен в документ, открытый с локального диска ( file:) или при использовании «iframe magic» ( about:).


0

//www.google-analytics.com/ga.jsне является URL-адресом в соответствии со своим стандартом, поскольку в нем отсутствует схема, которая является обязательной. Он работает и используется, но он не соответствует стандарту URL.

См. RFC3986 §3:

Компоненты схемы и пути являются обязательными, хотя путь может быть пустым (без символов). При наличии прав доступа путь должен быть либо пустым, либо начинаться с символа косой черты ("/"). Когда права доступа отсутствуют, путь не может начинаться с двух символов косой черты ("//").


Схема не требуется, если она одинакова в браузерах.
Metalshark

Прочитайте RFC, пожалуйста: схема обязательна во всех URL. Это не зависит от того, что происходит, стандарт просто говорит иначе, и в дикой природе есть отклонения.
Патрик Мевзек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.