【问题标题】:URL validation/connectivity using javascript使用 javascript 的 URL 验证/连接
【发布时间】:2011-11-28 08:47:53
【问题描述】:

我想使用 javascript 验证外部 url 是否有效/存在/响应。例如,“www.google.com”应返回 true,“www.google123.com”应返回 false。

我想通过测试将 AJAX 用于此目的: if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 但似乎这不适用于远程服务器(外部 url)。由于我的服务器使用代理,我计划使用浏览器端脚本,以便它自动使用用户的浏览器代理(如果存在)。 请告诉我我必须使用“AJAX 跨域”吗?如何实现这一点,因为我只是想验证一个 url。 除了使用 AJAX 之外还有什么方法?

【问题讨论】:

    标签: javascript ajax cross-domain


    【解决方案1】:

    我很确定这是不可能的。任何允许您在用户上下文中调用另一个域上的随机页面的 AJAX 都会打开各种类型或安全漏洞。

    您必须使用服务器端解决方案。

    【讨论】:

    • 正如我所说我的服务器使用代理,所以当我在 URL 构造函数中创建一个指定代理的 HttpURLConnection 时,它工作正常,但对于 https 连接,我又遇到了问题。由于 HttpsURLConnection con =(HttpsURLConnection) url.openConnection();-不起作用,仅适用于 HttpURLConnection。那么,如何实现这个简单的东西呢?
    • stackoverflow.com/questions/1511674/… 可能会有所帮助。听起来仍然不是特别简单。
    • 我不认为 URL 的 openConnection() 返回的对象可以类型转换为 HttpsURLConnection;虽然可以强制转换为 HttpURLConnection,但 HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();此外,我对浏览器端验证更感兴趣,因此我不必进行这些代理设置。
    【解决方案2】:

    避免跨域问题的常用方法是注入标签。像图像或脚本这样的标签可以从任何域加载它们的内容。你可以注入,比如说一个类型为“text/x-unknown”或其他东西的脚本标签,然后监听标签加载事件。当加载事件触发时,您可以再次从页面中移除脚本标签。

    当然,如果您要查找的文件恰好是图像,那么您可以new Image() 代替。这样您就不必通过注入标签来污染页面,因为图像在创建时会加载(这可用于预加载图像)。同样,只需等待图像上的加载事件。

    更新

    好的,看来我在这里草率下结论。浏览器之间在如何支持这一点上存在一些差异。下面是一个完整的例子,说明如何在 IE9 和最新版本的 Firefox、Chrome 和 Safari 中使用 script 标签来验证 url。

    它在旧版本的 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>
    

    【讨论】:

    • 如何在不返回图像时使用图像标签来测试 url 的有效性。例如, google.com" onerror="alert('This google image could not be loaded.')" /> 不起作用,它总是会进入错误部分,对于有效的 url 也是如此。还有什么办法吗?
    • 您不能使用图像来测试不是图像的 url,但我相信您可以使用脚本标签。只需将脚本标签类型设置为“text/plain”或其他内容,因此它不会尝试将其作为 javascript 处理。在这种情况下,您必须将标签插入页面,并将回调函数附加到它的 onload 事件。如果资源存在,则将调用回调。你也可以给 onerror 添加一个回调,如果资源不存在就会被调用
    • 脚本“type”标签采用“text/tcl”、“text/javascript”、“text/vbscript”等值。现在, 不起作用。没有警报。还有其他建议吗?
    • 你是对的 - 这是一个麻烦的跨浏览器。我添加了一个例子。我手头没有任何与旧版本 IE 兼容的解决方案,但您可以使用 onreadystate 事件做一些事情。
    猜你喜欢
    • 2011-08-28
    • 2012-09-08
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多