我对收到的答案并不满意(尽管我很欣赏Andreas Köberle 的建议),所以我决定自己解决这个问题。
我编写了一个可以按需运行的函数,它可以识别任何具有外国来源的 html 元素。这样,我可以在报告 javascript 错误时运行它以获取有关环境的更多信息。
代码
取决于 jQuery(对不起,元素选择要容易得多)和parseUri()
(复制在这个答案的底部)
/**
* Identifies elements with `src` or `href` attributes with a URI pointing to
* a hostname other than the given hostname. Defaults to the current hostname.
* Excludes <a> links.
*
* @param string myHostname The hostname of allowed resources.
* @return array An array of `ELEMENT: src` strings for external resources.
*/
function getExternalSources(myHostname)
{
var s, r = new Array();
if(typeof myHostname == 'undefined')
{
myHostname = location.hostname;
}
$('[src], [href]:not(a)').each(function(){
s = (typeof this.src == 'undefined' ? this.href : this.src);
if(parseUri(s).hostname.search(myHostname) == -1)
{
r.push(this.tagName.toUpperCase() + ': ' + s);
}
});
return r;
}
用法
var s = getExternalSources('mydomain.com');
for(var i = 0; i < s.length; i++)
{
console.log(s[i]);
}
// Can also do the following, defaults to hostname of the window:
var s = getExternalSources();
搜索包括子域,因此在上面的示例中允许使用具有www.mydomain.com
or来源的元素。img.mydomain.com
请注意,这不会在 CSS@import
规则(或任何带有 aurl()
的 CSS 规则)中获取外部资源。如果有人想贡献可以做到这一点的代码,我会投票并接受你的回答。
下面是parseUri()
我从https://gist.github.com/1847816获得的代码(并稍作修改)。
(function(w, d){
var a,
k = 'protocol hostname host pathname port search hash href'.split(' ');
w.parseUri = function(url){
a || (a = d.createElement('a'));
a.href = url;
for (var r = {}, i = 0; i<8; i++)
{
r[k[i]] = a[k[i]];
}
r.toString = function(){return a.href;};
r.requestUri = r.pathname + r.search;
return r;
};
})(window, document);