如何在jQuery中测试URL

我有一个URL,我想在FancyBox (或任何其他叠加类型弹出窗口)中打开。 我不知道URL是否好,所以我想测试一下。 如果无效 – 我不会将fancyBox插件附加到该特定URL,它将只是一个常规链接。 如何在插入插件之前测试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中看到它,但这不是很有用)。

谢谢,祝大家周末愉快。

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

 $("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”以仅获取所请求页面的标题,这样会更快并让您知道您想要的内容。

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

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

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

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

看看你的问题The problem is, xhr will not always be defined because JS doesn't wait for the request to complete. ,可以通过创建一个来使调用等待响应

 $().ajax({args}); 

使用async: false调用async: false

有关详细信息,请查看http://api.jquery.com/jQuery.ajax/上的参数async

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

来自webmonkey的说明:

但现在我们有了Addy Osmani的Catch404,这是一个jQuery插件,用于处理带有样式的断开链接。 在您的站点上部署Catch404,而不是看到报告链接断开的页面,向用户呈现Ajax模式窗口(也称为跳跃或灯箱),通知他们链接页面不存在。 窗户还提供了一些他们可能想要检查的备用目的地。