【问题标题】:Javascript detect which host it was loaded fromJavascript 检测它是从哪个主机加载的
【发布时间】:2013-10-20 02:44:49
【问题描述】:

我正在开发一个 Javascript 库。它可以自托管或从另一台服务器运行。该脚本进行了许多 AJAX 调用,首选方法是向包含页面的同一主机发出 POST 请求。为了允许跨域调用,它还支持 JSONP,但这限制了可以发送的数据量(大约 2K 以安全地适应大多数现代浏览器的 URL 长度限制)。

显然,包含脚本的用户知道他们从哪里获取它,并且可以根据需要手动选择 JSONP,但为了简化事情,我想在脚本本身内检测脚本是否已加载是否来自与包含它的页面相同的主机。

我可以使用 jQuery 获取脚本元素,但执行 $('script').attr('src') 只会返回相对路径(例如“/js/my-script.js”而不是“ http://hostname.com/js/my-script.js") 即使它是从不同的主机加载的。

这可能吗?如果可以,我会怎么做?

提前致谢。

【问题讨论】:

  • 从哪里加载 JavaScript 源文件没有任何区别。 AJAX 调用是否跨域仅取决​​于主 HTML 文件的来源。
  • 这就是我要确定的:脚本是否从与页面相同的主机加载(因此需要调用与页面相同的主机)或者它是否是从相对于页面的另一个主机加载的(因此需要进行 JSONP 调用 x-domain)。具体我打算做什么并不重要,基本问题仍然存在:脚本是否可以确定它从哪个主机加载以与 document.location.hostname 进行比较。
  • 你误会了。 唯一 重要的域是主页的域。这就是为什么您可以从 Google CDN 加载 jQuery 并且它的工作方式完全相同就像您从自己的域加载它一样。您正在尝试解决一个不存在的问题:)
  • 也许我一直不清楚这一切是如何结合在一起的(尽管您忽略了实际问题,但我会指出)。无论从哪个主机加载脚本,它都会调用它的主机。如果该主机与加载脚本的页面相同,我将 $.post 以便我可以一次使用大量数据进行调用。如果加载主机不同,我需要使用 dataType: 'jsonp' 使用 $.ajax 来绕过 x 域限制,因此需要以较小的块发送数据(
  • 现在我明白你在问什么了;您的脚本与某个服务器对话,并且它的设计使得它隐式地与它来自的服务器对话。好吧,我猜这算是一种罕见而奇怪的情况:)我很抱歉。

标签: javascript ajax cross-domain detection hostname


【解决方案1】:

不要使用 JSONP,使用 CORS 标头。

但如果你真的想做JS检查,请使用var t = $('script')[0].outerHTML

在我的页面上的效果: [20:43:34.865] "<script src="http://www.google-analytics.com/ga.js" async="" type="text/javascript"></script>"

【讨论】:

  • 如果您不需要支持具有大量市场渗透率的浏览器,那么 CORS 非常棒。
  • 没关系。 element.outerHTML 甚至是 IE 4.0 的答案。
【解决方案2】:

检查location.host 应该可以解决问题。

【讨论】:

  • 地址是页面的位置,而不是脚本。上面的 cmets 和随后的聊天澄清了所有这些。
猜你喜欢
  • 2022-01-11
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2013-09-04
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多