15

我想使用与加载当前运行的 JavaScript 的页面相同的方案(可能是“http:”或“https:”)构建 URL。现代浏览器支持简单地省略该方案(例如,src="//example.com/test.js"),但这并不完全跨浏览器兼容。(我读过 IE 6 是唯一不支持它的浏览器,但我仍然需要与该版本兼容。)

执行此操作的跨浏览器方法似乎是检查location.protocol. 例如,谷歌分析使用:

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

在 Google 的案例中,他们希望根据请求是否使用 SSL 来使用不同的域,因此这种模式是有意义的。但是我看到其他人使用相同的模式,即使只有协议不同:

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

(一个例子在http://css-tricks.com/thinking-async/的“Final Wufoo Snippet”中。)

我更喜欢使用这个更简单的表达式:

location.protocol + "//example.com"

location.protocol当我的代码在我无法控制的网站上使用时,我是否真的应该担心会出现“https:”或“http:”以外的其他值?

4

3 回答 3

14

它总是被设置为某个值,但有时它可能被设置为一个既不是“http”也不是“https”的值。您最有可能看到的其他三个值是file:(对于 HTML 文件)、about:(对于涉及 的 iframe 魔术about:blank),也许还有ftp:.

于 2012-11-03T23:20:28.197 回答
5

注意:这并不是关于 document.location.protocol 的返回是否有效,而是描述了一个很难发现的错误(您可以覆盖 document.location.protocol 的行为而无需编写任何 javascript)。

我遇到了一个看似奇怪的案例,其中document.location.protocol似乎没有按应有的方式工作。该站点有一个跟踪-Javascript,它使用以下代码段来解析当前协议:

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

该站点使用 HTTPS,但在某些页面上,协议会变成http而不是预期的https

在谷歌搜索和调查应用程序堆栈配置上花费了大量时间后,一位开发人员发现出现协议解决问题的页面具有具有以下属性的 HTML 表单:

name="location"

这导致协议解析行为不端,并错误地将协议推断为 http 而不是 https(不,表单没有称为协议的字段,也不应该有)。

于 2014-05-05T07:16:09.833 回答
2

当我的代码在我无法控制的网站上使用时,我真的应该担心 document.location.protocol 具有“https:”或“http:”以外的其他值的可能性吗?

不是特别的,但话又说回来,你的方法没有特别的危害(无论协议是什么)。Google Analytics 可能会进行实际检测,因为它们使用的主机与其他主机不同。

于 2012-11-03T23:20:44.727 回答