如何在jQuery中测试URL

时间:2009-06-26 21:01:34

标签: jquery ajax

我有一个网址,我想在FancyBox(或任何其他叠加式弹出窗口)中打开。我不知道URL是否好,所以我想测试一下。如果无效 - 我不会将fancyBox插件附加到该特定URL,它将只是一个常规链接。 如何在将插件附加到网址之前测试网址?尝试执行以下操作:

$("a.overlay").each(function() {
    var xhr = $.get(this.href, function(data, status) {
        // never executed in case of a failed request
    });
    if (xhr.status && xhr.status === 404)) {
        // not good, do nothing
    } else {
        // can attach plugin here
    }
});

问题是,xhr并不总是被定义,因为JS不等待请求完成。同样,我不能使用回调函数,因为它似乎没有在请求失败的情况下执行(我可以在Firebug中看到它,但这不是很有用)。

谢谢大家周末愉快。

4 个答案:

答案 0 :(得分:7)

你可以这样做,虽然我会质疑为每个链接提出请求是多么明智....

$("a.overlay").each(function() {
    var $a = $(this);
    $.ajax({
        type: 'GET',
        url: this.href,
        success: function() {
            // attach plugin here
        },
        error: function() {
            // not good, log it
        }            
    });
});

如果你不打算对页面的内容做任何事情,你可以用'HEAD'切换'GET'只获取所请求页面的标题,这会更快,让你知道你想要什么

答案 1 :(得分:1)

Paolo为您提供了所要求的答案 - 但每次客户都要检查链接的质量对我来说似乎很浪费。它不仅浪费了目标的带宽,而且浪费了客户的时间。

这是可以而且应该在服务器端进行一次(可能是每天)的事情。从那里你应该生成适当的html / js。从工程的角度来看,这对我来说似乎是一种更明智的方法。

我不知道你正在使用什么样的服务器端框架,如果有的话,但我使用的任何一个都有相当简单的内置http客户端,以及chronjob /预定的工作设施。

或者,您可以创建页面,以便当天的第一个请求进行检查,并将结果缓存到磁盘(或内存)以备将来的全天请求。第一次加载可能会有点慢。

答案 2 :(得分:0)

查看您的问题The problem is, xhr will not always be defined because JS doesn't wait for the request to complete.,可以通过创建

来使呼叫等待响应
$().ajax({args});

使用async: false拨打电话。

检查http://api.jquery.com/jQuery.ajax/上的参数async以获取更多详细信息。

答案 3 :(得分:0)

我知道这已经很老了,但仍然会添加它以防有人遇到并想要更多选择。看一下这个插件:http://www.webmonkey.com/2010/07/beautify-broken-links-with-catch404/

来自webmonkey的说明:

  

但现在我们有Addy的Catch404   Osmani,一个处理的jQuery插件   破碎的风格链接。部署   Catch404在您的网站上,而不是   看到报告链接断开的页面,   向用户呈现Ajax   模态窗口(也称为跳跃,或   一个灯箱)通知他们链接   页面不存在。窗户也   提供一些替代目的地   他们可能想看看。