Является ли location.protocol когда-либо недействительным? - программирование
Подтвердить что ты не робот

Является ли location.protocol когда-либо недействительным?

Я хочу создать URL-адреса с той же схемой (предположительно, "http:" или "https:" ) в качестве страницы, загружающей текущий JavaScript. Современные браузеры поддерживают просто опускание схемы (например, src="//example.com/test.js"), но это не полностью совместимо с кросс-браузером. (Я читал, что IE 6 является единственным браузером, который его не поддерживает, но мне все еще нужна совместимость с этой версией.)

Кросс-браузерный способ сделать это, похоже, состоит в проверке location.protocol. Например, Google Analytics использует:

('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + ...

В случае Google они хотели использовать разные домены в зависимости от того, использует ли запрос SSL, так что шаблон имеет смысл. Но я видел, что другие используют один и тот же шаблон, даже если только протокол отличается:

('https:' == location.protocol ? 'https:' : 'http:') + "//example.com"

(Например, в "Final Wufoo Snippet" в http://css-tricks.com/thinking-async/.)

Вместо этого я предпочел бы использовать это более простое выражение:

location.protocol + "//example.com"

Должен ли я действительно беспокоиться о возможности location.protocol использовать какое-то значение, отличное от "https:" или "http:", когда мой код используется на сайтах, которые я не контролирую?

4b9b3361

Ответ 1

Он всегда будет установлен на что-то, но иногда может быть установлено значение, которое не является "http" или "https". Три других значения, которые вы, скорее всего, увидите: file: (для файлов HTML), about: (для магии iframe с участием about:blank) и, возможно, ftp:.

Ответ 2

Примечание.. Это не относится к тому, что document.location.protocol возвращает действительный или нет, но описывает очень сложную ошибку (вы можете переопределить поведение document.location.protocol, не записывая никаких Javascript).

Я столкнулся с одним, казалось бы, странным случаем, когда document.location.protocol, похоже, не работал должным образом. На сайте был отслеживающий Javascript, который использовал следующий фрагмент для разрешения текущего протокола:

var proto = ('https:' === document.location.protocol ? 'https://' : 'http://')

Сайт был на HTTPS, но на некоторых страницах протокол оказался http вместо ожидаемого https.

После большого количества времени, проведенного в Googling и изучения конфигурации стека приложений, один разработчик заметил, что страницы, на которых возникает проблема разрешения протокола, имеют HTML-форму со следующим атрибутом:

name="location"

Это заставило разрешение протокола ошибочно ошибиться и неправильно вывести протокол на http вместо https (нет, форма не имела поля, называемого протоколом, и оно не должно быть).

Ответ 3

Должен ли я действительно быть обеспокоен возможностью document.location.protocol принимать какое-то значение, отличное от "https:" или "http:", когда мой код используется на сайтах, которые я не контролирую?

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