jQuery:选择所有内部链接,不包括可下载文件的链接

3
我正在使用以下jQuery代码来选择所有内部链接...
var siteURL = "http://" + top.location.host.toString();
var $internalLinks = $("a[href^='"+siteURL+"'], a[href^='/'], a[href^='./'], a[href^='../'], a[href^='#']");

它能够很好地工作。我面临的唯一问题是,我不想选择直接指向可下载文件的内部链接(例如http://www.example.com/downloadable.pdf

扩展名可能是任何东西(pdf、mp3、jpg、gif、webm等)

现在的问题是,如何从上述标准中排除这些内部链接?

或者如果我使用.not()函数来排除这些链接,那么问题就是,如何选择所有直接指向这些可下载文件的内部链接?


2
任何URL都可以返回任何类型的数据。您无法确定URL将提供哪种类型的文件。像http://www.example.com/123这样的URL可能会返回HTML、MP3或JPEG数据,而像http://www.example.com/me.html这样的URL可能会返回PDF。文件扩展名只是一种约定。如您所问,这个问题实际上是没有答案的。您应该更新它以反映您正在寻找一种通用的方法来排除具有特定文件扩展名的URL。 - user229044
@meagar 你是对的,问题现在已经更新。 - Faisal Khurshid
任何文件都可以下载。这就是您能够在浏览器中查看它或将文件保存到桌面的方式。没有自动执行此操作的方法;您必须自己定义扩展名。 - Fillip Peyton
3个回答

4
一种简单的解决方案是使用正则表达式的filternot来拒绝您不想要的链接:
var $internalLinks = $("a[href^='"+siteURL+"'], a[href^='/'], a[href^='./'], a[href^='../'], a[href^='#']");

$internalLinks = $internalLinks.not(function () {
  return $(this).attr('href').match(/\.(pdf|mp3|jpg|jpeg|etc)$/i);
});

假设你所有的“不可下载”的链接都以.html.htm结尾,相反的方法是筛选这些扩展名的链接:

$internalLinks = $internalLinks.filter(function () {
  return $(this).attr('href').match(/\.html?/);
});

我能否自动化过滤掉所有以任何可下载文件扩展名结尾的内部链接,而无需手动定义这些扩展名? - Faisal Khurshid
不行,因为并不存在所谓的“可下载扩展”。你需要明确地将你想要的扩展名(例如.htm和.html)列入白名单,或者明确地将你不想要的扩展名列入黑名单。这是无法自动完成的。 - user229044
那么有没有办法选择所有以任何文件扩展名结尾的内部链接,无论是 .html 还是 .pdf 呢?因为在这种情况下,事后白名单几个扩展名(例如 .html、.php 等)会比手动黑名单每个扩展名更容易一些。 - Faisal Khurshid
/users/joe-bob 这样的链接怎么办? - user229044
好的,现在我明白了问题。谢谢,我太累了,现在应该去睡觉了。我接受你的答案作为被采纳的答案。 - Faisal Khurshid

1

0

如果您有一个正在使用的文件类型列表,您可以使用 .not. 未经测试:

$internalLinks = $internalLinks.not($('a[href$=".mp3"]')...

我可以使用这种方式,但在这种情况下,我必须手动定义所有扩展名。我想在这里找到更好的方法,不应包括手动定义每个文件扩展名。 - Faisal Khurshid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接