禁用任何网站中的所有超链接

6
有没有一种方法可以使用JavaScript禁用任何网站中的所有超链接?
我想这样做的原因是为了文本选择。许多网站将整个文本块放在a标签内,使得选择文本变得困难。
我在Kubuntu 13.10上使用Chromium和Firefox浏览器。

你可以循环遍历document.links,它是页面中所有链接的集合,并添加监听器以防止导航。 - RobG
或者,只需删除href属性,使它们不再是链接。 - RobG
@RobG,你能否在http://nos.nl/上测试一下这个技巧?在左侧,当所有href属性被删除后,仍然有一些块表现得像链接。 - qed
5个回答

8

要禁用所有链接,请使用以下方法:

$('a').bind("click.myDisable", function() { 
   return false; 
});

并启用它使用

$('a').unbind("click.myDisable");

1
这是一个更好的答案,因为如果您以后想要重新启用链接,它是清晰简洁的。 - jasonleonhard

4
是的,你可以使用Firefox的Greasemonkey插件和Chrome的Tampermonkey插件来实现此功能。
更新:
在Greasemonkey中使用以下代码。它将所有链接替换为。这样它们就可以像普通文本一样被选中:
// @require       http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.js

(function($) {
    $.fn.changeElementType = function(newType) {
        var attrs = {};

        $.each(this[0].attributes, function(idx, attr) {
            attrs[attr.nodeName] = attr.nodeValue;
        });

        this.replaceWith(function() {
            return $("<" + newType + "/>", attrs).append($(this).contents());
        });
    };
})(jQuery);

$('a').changeElementType('span');

新版(性能更优):

脚本可以是:

var links = document.getElementsByTagName('a');
for(var i=0;i<links.length;i++)
{
  links[i].href='#';
  links[i].onclick = function(){  return false; };
}

使用这种方法,链接确实被禁用了,但是文本选择也变得不可能。双击不会选择单词,单击并拖动也无法选择任何内容。 - qed
A元素不一定是链接,它们可能是锚点。添加href属性将把它们转换为链接,即使它们最初不是链接。 - RobG

3

好的,根据Rob G所说的内容,我会给出一个完全不同的答案。

for (var x=document.links.length-1;x>=0;x--) {
document.links[x].removeAttribute("href")
}

你的第一个答案更好。 :) 在这个答案中,点击链接会带你到一个未定义的页面。请尝试使用此URL:http://nos.nl/ - qed

1
function replaceA(element) {
    for (var i=element.children.length-1;i>=0;i--) {
        var getChild = element.children[i];
        if (getChild.tagName == "A") {
            element.innerHTML = element.innerHTML.replace(getChild.outerHTML,getChild.innerHTML);
        } else {
            replaceA(getChild);
        }
    }
}

window.onload = function(){replaceA(document.body)};

这个方法有些不规范,基本上当页面加载完成后,它会将所有链接替换为它们的innerHTML文本。如果你想在页面加载时不使用它,只需删除window.onload部分,并在需要使用时调用replaceA(document.body)。


为什么要循环遍历页面中的每个元素,当document.links已经是页面中所有链接的现成集合? - RobG
只是一种懒惰的方法,用来知道父元素是什么,以便我可以替换包含链接的父元素的innerHTML。 - Greg Hornby

1
根据这个论坛帖子,有一些选项:
  1. 我通常将其粘贴到“TextEdit”中,并确保TexEdit将字体显示为纯文本。然后从TexEdit复制链接或文本,并将其粘贴到Pages中。
  2. 打开检查器面板。选择倒数第二个标签称为“链接检查器”,然后突出显示链接本身。单击“启用超链接”复选框以关闭它,它将消失。
  3. 在Pages首选项中,“自动更正”选项卡上有一个选项可以“自动检测电子邮件和网址”。取消勾选它,如果您要粘贴的内容包含URL或电子邮件地址,则不应发生此情况。
希望这有所帮助。

这并没有回答如何使用JavaScript清除文本链接的问题。此外,TextEdit、Pages和Inspector都是Mac应用程序/功能。OP正在使用kubuntu,无法访问这些工具。 - Michael Noguera

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