【问题标题】:why is there no protocol specified for this script tag为什么没有为此脚本标签指定协议
【发布时间】:2013-02-12 12:35:14
【问题描述】:

有了这个我可以生成一个赞按钮:D

<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

但为什么不是

js.src = "一些协议://connect.facebook.net/en_US/all.js#xfbml=1";

为什么没有具体的协议?

【问题讨论】:

标签: javascript facebook


【解决方案1】:

这是一个有用的技巧,它允许您使用适用于 HTTP 和 HTTPS 页面的单个引用。当 URL 的协议被省略时,浏览器将使用底层文档的协议。

在通过常规、未加密的 HTTP 加载的页面上,使用该 URL 的脚本引用将通过 HTTP 加载并正常缓存。同样,在通过 HTTPS 加载的安全页面上。

因此,使用无协议 URL 允许单个脚本引用自行适应最佳状态:HTTP 及其对 HTTP 页面的完全缓存支持,以及安全页面上的 HTTPS,这样您的用户就不会遇到混合内容警告。

来源:http://encosia.com/cripple-the-google-cdns-caching-with-a-single-character/

【讨论】:

    【解决方案2】:

    这是一个名为protocol-relative URL 的小技巧,可以“让您省去一些麻烦”。

    【讨论】:

      【解决方案3】:

      不指定协议可确保脚本文件的请求也假定发起请求中使用的相同协议。

      如果您通过http请求,脚本将通过https等加载。

      【讨论】:

        【解决方案4】:

        为什么没有具体的协议?

        因为省略 URL 的方案部分会告诉客户端使用他已经在使用该资源嵌入文档的请求的协议。

        在这种情况下,它允许浏览器选择 http:// 或 https://,具体取决于文档本身是通过“普通”HTTP 还是 HTTPS 加载的。

        【讨论】:

          【解决方案5】:

          当协议被省略时,浏览器会根据当前页面的协议假定httphttps。这允许包含外部资源而无需担心安全警告。

          当然,要使其工作,外部资源的路径必须在当前页面的协议中可用。

          【讨论】:

          • 是的,这使得脚本无法在位于 file:// 或其他协议的页面中正常运行。该死的..
          • @Ser1 是的,但您可以手动重写它。虽然我不确定为本地页面生成 Like 按钮是否有意义。
          • 我尝试将其重写为http://connect.facebook.net/en_US/all.js#xfbml=1 我仍然无法获得我的like 按钮。我认为在 all.js 中还有另一个没有协议的 src。只是在启动之前测试一个网站,但我认为我不应该担心喜欢按钮:)
          猜你喜欢
          • 2018-10-22
          • 1970-01-01
          • 2016-09-29
          • 2012-05-06
          • 2017-05-06
          • 1970-01-01
          • 2013-04-03
          • 2018-08-04
          • 2014-04-25
          相关资源
          最近更新 更多