根本不可能获取引用的任何文件的内容<script>
标签。这是有充分理由的:这样做可以让您绕过 XHR 的同源政策。
考虑:
<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>
如果您可以访问响应的文本,您就可以执行以下操作:
var stolenAuthToken = $('#s').text();
这显然很糟糕。因此,您永远不允许阅读由<script>
tags.
最近推出的一项措施使您的具体情况变得复杂change https://bugzilla.mozilla.org/show_bug.cgi?id=363897跨源脚本中的错误不报告any对您的页面有用的信息onerror
处理程序。 (本质上,这样做是为了修补信息泄露安全漏洞,该漏洞允许恶意网站推断您是否登录了某些知名网站等。)
这意味着您无法从 CDN 托管的脚本中获得有关错误的有用信息,因此另一个改变 https://bugzilla.mozilla.org/show_bug.cgi?id=696301是为了允许使用CORS https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS让 CDN(或其他非同源)服务器选择允许将完整的错误详细信息传递给onerror
处理程序。
我们(Facebook)需要一种机制来禁用window.onerror
静音行为实施于#363897 https://bugzilla.mozilla.org/show_bug.cgi?id=363897。我们的静态脚本资源在与主站点不同的域下的 CDN 上提供。由于这些域不同,我们与 x 域逻辑发生了冲突,该逻辑阻止我们收集有关浏览器错误的有用信息。
这个“功能”已经在野外(在 Firefox 和 Webkit 浏览器中)被广泛采用,以至于我们在生产中看到的大多数未捕获的异常现在都没有可操作的信息。
The crossorigin属性 https://developer.mozilla.org/en-US/docs/HTML/Element/img#attr-crossorigin(最初是为了<img>
) 允许您指定应使用 CORS 规则加载资源。它已由 Mozilla 实施,WebKit https://bugs.webkit.org/show_bug.cgi?id=70574, and Chrome https://code.google.com/p/chromium/issues/detail?id=159566.
<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script>
对你来说不幸的是,在我的testing http://jsfiddle.net/josh3736/jm2JU/,我发现Google CDN确实not发送 CORS 标头。
GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js HTTP/1.1
Host: ajax.googleapis.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://fiddle.jshell.net/josh3736/jm2JU/show/
Origin: http://fiddle.jshell.net
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Vary: Accept-Encoding
Content-Type: text/javascript; charset=UTF-8
Last-Modified: Tue, 13 Nov 2012 19:53:02 GMT
Date: Wed, 02 Jan 2013 22:54:25 GMT
Expires: Thu, 02 Jan 2014 22:54:25 GMT
X-Content-Type-Options: nosniff
Server: sffe
Content-Length: 93637
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=31536000
Age: 169036
...
请注意Origin
请求中的标头(指示 CORS 请求),并且缺少Access-Control-Allow-Origin
响应中的标头。因此,即使您将crossorigin
属性,CORS 检查将失败,并且您的脚本将收到已清理的错误详细信息。
有一个三年前的问题 http://code.google.com/p/google-ajax-apis/issues/detail?id=427在 Google CDN 服务器上启用 CORS。我不会屏住呼吸。
tldr:如果您想要有意义的错误消息,您必须自己在同一源上托管所有 JavaScript。