我想使用javascript验证外部网址是否有效/存在/响应。例如,“www.google.com”应返回true,“www.google123.com”应返回false。
我想通过测试来使用AJAX:if(xmlhttp.readyState == 4&& xmlhttp.status == 200)但似乎这对远程服务器(外部URL)不起作用。由于我的服务器使用代理,我计划使用浏览器端脚本,以便它自动使用用户的浏览器代理(如果存在)。 请告诉我,我必须使用“AJAX Cross Domain”吗?如何实现这一点,因为我只是想验证一个网址。 除了使用AJAX之外的任何其他方式?
答案 0 :(得分:0)
我很确定这是不可能的。任何允许您在用户上下文中调用另一个域上的随机页面的AJAX都会打开所有类型或安全漏洞。
您必须使用服务器端解决方案。
答案 1 :(得分:0)
避免跨域问题的常用方法是注入标记。像图片或脚本的标签可以从任何域加载其内容。你可以注入一个类型为“text / x-unknown”的脚本标签,然后听标签load-event。当load事件触发时,您可以再次从页面中删除脚本标记。
当然,如果您要查找的文件恰好是图片,那么您可以new Image()
。这样您就不必通过注入标记来污染页面,因为图像在创建时会加载(这可以用于预加载图像)。再次,只需等待图像上的加载事件。
<强>更新强>
好吧,我似乎在这里得出结论。浏览器之间在如何支持它方面存在一些差异。以下是一个完整的示例,介绍如何使用脚本标记验证IE9中的URL以及最新版本的Firefox,Chrome和Safari。
它在旧版本的IE(至少IE8)中不起作用,因为它们显然不会为脚本标记提供加载/错误事件。
如果script-tag的contenttype不为空或设置为'text / javascript',则Firefox拒绝加载任何内容。这意味着使用此方法检查脚本文件可能有点危险。在我的测试中执行任何代码之前,似乎删除了脚本标记,但我不确定......
无论如何,这是代码:
<!doctype html>
<html>
<head>
<script>
function checkResource(url, callback) {
var tag = document.createElement('script');
tag.src = url;
//tag.type = 'application/x-unknown';
tag.async = true;
tag.onload = function (e) {
document.getElementsByTagName('head')[0].removeChild(tag);
callback(url, true);
}
tag.onerror = function (e) {
document.getElementsByTagName('head')[0].removeChild(tag);
callback(url, false);
}
document.getElementsByTagName('head')[0].appendChild(tag);
}
</script>
</head>
<body>
<h1>Testing something</h1>
<p>Here is some text. Something. Something else.</p>
<script>
checkResource("http://google.com", function (url, state) { alert(url + ' - ' + state) });
checkResource("http://www.google.com/this-does-not-exists", function (url, state) { alert(url + ' - ' + state) });
checkResource("www.asdaweltiukljlkjlkjlkjlwew.com/does-not-exists", function (url, state) { alert(url + ' - ' + state) });
</script>
</body>
</html>