如何防止将非Tynt JavaScript注入“阅读更多:www.site.com”到复制粘贴操作中?


30

当您在浏览器中复制文本时,有很多网站在剪贴板中插入了“阅读更多:www.site.com”之类的内容。我觉得这很可恶。如果网站恰巧使用服务Tynt(通过仅阻止Tynt域),则Google搜索揭示了一些 阻止该问题的方法,但是许多网站使用了自己的JavaScript。

除了关闭JavaScript之外,还有一种阻止这种行为的通用方法吗?我使用Chrome,但是我对所有解决方案都感兴趣。

编辑:明确地说,我希望能够保留这些网站的其余JavaScript功能,因为如果没有它,很多网站都会崩溃。

编辑#2:这是两个示例网站,尽管我使用了Tynt阻止程序,这些网站仍在骚扰我:边际革命 | 财政时报

这是两个StackOverflow 问题和两个博客 文章,它们解释了在没有Tynt的情况下手动实施这种阴暗做法的方法。这是一篇博客文章,描述了如何可靠地阻止这种情况。这是我可以找到的最新讨论(2013年3月),其中提供了有关如何使用AdBlock在Chrome中阻止此操作的建议,但对我而言不起作用。

Answers:


24

添加烦人的“阅读更多”内容的站点是ShareThis。

为了防止这种不良行为,您可以使用三种不同的选择:

禁用剪贴板事件

这些网站使用剪贴板API,使Web开发人员可以拦截复制/剪切/粘贴操作并在执行操作时执行一些代码。这就是ShareThis(和其他类似网站)的工作方式。它只是等待复制事件,并且在执行有效复制之前,它会添加一个额外的文本“图层”,其中包含令人讨厌的“-See ...”。

现在的问题是:是否有任何方法可以禁用剪贴板事件?不幸的是,我无法在Chrome / Chromium中找到执行此操作的方法,但是在Firefox中,可以通过两种不同的方式实现。

  • 进入about:config并搜索dom.event.clipboardevents.enabled。双击键(将其设置为false),瞧!您已禁用剪贴板事件,没有人会再次触摸剪贴板。
  • 对于Firefox的较旧版本(确实是较旧的版本),此扩展名的功能与该about:config选项完全相同。

禁用剪贴板事件不会损害任何网站的体验,因为它们很少被使用,并且实际上没有使用它们的目的(垃圾邮件除外)。

让我们进入第二个解决方案。

阻止ShareThis

如果您不需要ShareThis,则只需阻止该w.sharethis.com域。负责加载ShareThis(并注册ClipboardEvent)的Javascript 从该网站加载。

您可以用不同的方式阻止它,从简单的AdBlock过滤器到编辑主机文件(由于我的名声无法放置更多链接,因此此处未涉及或链接)。

通过hosts文件执行此操作的示例:

127.0.0.1 w.sharethis.com

第三种解决方案是最难解决的,只能作为不得已而为之。

在有问题的网站上禁用选择功能

这些网站使用SelectionAPI来编辑要复制到剪贴板的内容,该API允许他们即时编辑选择。因此,一种解决方案是完全禁用任何一种Selection(显然在代码方面。您仍然可以执行选择)。

这可以通过简单的Tampermonkey / Greasemonkey脚本来完成。由于我目前无法安装Chrome,因此我仅在Firefox上进行了测试。对此我感到抱歉。

这是源代码:

// ==UserScript==
// @name        Goodbye selections
// @namespace   tag: utils
// @include     $put_here_a_website_you'd_like_to_disable_selections$
// @include     $more_websites$
// @version     1
// @grant       none
// ==/UserScript==
(function() {
    var disableSelections = function() {
        document.getSelection = window.getSelection = function() {
            return { isCollapsed: true };
        };
    };
    var script = document.createElement ("script");
    script.appendChild (document.createTextNode ("(" + disableSelections + ")();"));
    (document.body || document.head || document.documentElement).appendChild (script);
})();

为此,您应该创建一个新的Greasemonkey / Tampermonkey脚本并调整@include指令。您可以每行放置一个网站,它必须像那样完成@include http://bad.website.address/

我已经在您链接的两个网站上对其进行了测试,并且没有问题。但是,请记住,这可能会导致问题,因为Selections被完全合法的网站使用(例如,当您单击按钮时,StackExchange文本框使用它们将符号插入符号到插入符号的位置),因此应启用该用户脚本仅在有问题的网站上显示。

(请注意,//如果您要从Greasemonkey / Tampermonkey菜单创建用户脚本,则可能需要删除开头的行,它们会自动添加它)

用户脚本的解释非常简单。首先,它定义了一个名为的函数,该函数disableSelections将默认值document.getSelectionwindow.getSelection函数替换为仅返回包含的对象的函数{ isCollapsed: true }。为什么?因为ShareThis(我已经在他们的JS代码中检查了)调用该函数并检查该isCollapsed属性是否设置为true(如果设置为,它将停止“剪贴板中毒”)。诸如此类的其他网站可能不会执行该检查,但是当它们尝试调用Selection对象的合法函数时,它们只会以错误结尾。

然后将该功能注入到正文/标题/文档中,它将自动执行。您可能会问的一个问题是:如果Javascript允许(几乎)覆盖每个函数,那么为什么addEventListener在事件为复制/剪切/粘贴时不覆盖该函数以简单地不执行任何操作?答案很简单。用户脚本在不可预测的时间执行,这意味着ShareThis Javascript可以用户脚本之前加载,并且不会执行任何操作。相反,仅重写该window.getSelection函数就不会有任何问题,因为在执行复制时才调用该函数,并且我们100%确定复制文本时,该用户脚本已经加载。

结论

最好,最干净的解决方案显然是第一个,因为它禁用了几乎无用的API。

第二个也是有效的,但是您将失去任何ShareThis功能。

第三个是最“ hacky”的,但作为最后手段,它可以工作。


非常感谢你!太好了 可惜的是,这是如此困难,并且没有完美的解决方案,但是您的答案似乎是互联网上当前可获得的最佳信息。非常荣幸地授予您赏金。
杰西·里德尔

是的,我做了很多研究,因为那个问题也影响了我。谢谢您提供的赏金-这将有助于我的“新手” StackExchange体验!
罗伯托夫

回复:第一个,这是否阻止了您可以单击按钮以复制一些文本的网站?例如,emojipedia.org/snowman。根据经验,在Firefox中似乎没有。凉。回复:阻止ShareThis,我的调试器现在显示从子域“ l.sharethis.com”和“ ws.sharethis.com”加载的脚本。因此,我认为唯一的解决方法是封锁整个ShareThis.com域,这不会造成太大损失。谢谢@Robertof!
康拉德·迈耶

警告:禁用剪贴板事件可能会导致某些站点发生故障。例如,它会导致Discord在粘贴到搜索时崩溃。
尼古拉斯

2

这些可恶的行为可以通过“杀人恶魔”扩展程序在Chrome上阻止:

https://chrome.google.com/webstore/detail/kill-evil/epieehnpcepgfiildhdklacomihpoldk

(编辑)该扩展名似乎在Facebook上引起奇怪的问题,请确保将其列入白名单。


优秀!我发现了三个扩展可以解决这个问题:1. Tynt Blocker。2. RightToCopy。3.杀死邪恶(感谢您,海鸥)。杀那些邪恶的是,曾在phys.org修复特别讨厌的剪贴板操作的一个,
戴夫·伯顿

1
@DaveBurton不必担心–请注意,此扩展会导致许多站点的行为异常,因此请仅在需要时启用它。
海鸥

2
Kill Evil支持排除列表或“白名单”,这是您不希望对其启用扩展的站点的列表(即“允许邪恶”列表)。那不是我想要的:我只想仅在特定站点(phys.org)上启用Kill Evil。因此,我最后得到了这个棘手的“负前瞻”正则表达式,以禁用Kill Evil,但该站点除外:^ https?:\ / \ /(?!([a-zA-Z0-9 \-\ ..] * phys \ .org))
戴夫·伯顿

喜欢厚脸皮的正则表达式。感谢您发布。
海鸥

1

尽管它是Firefox插件,但NoScript允许您通过设置不受信任的列表来阻止任何网站的JavaScript。


2
感谢您的回答,但这不是我所需要的。(我想要的东西不会破坏网站上所有地方的JavaScript。)我将对问题进行更具体的编辑。
杰西·里德尔

1

如果您正在寻找一种在显示之前自动修改HTML的方法,那么Greasemonkey是该工具,您将需要创建一个执行修改的用户脚本。

摘自《Google Chrome浏览器中的Greasemonkey脚本入门指南》一文:

Chrome现在原生支持用户脚本。您无需安装额外的扩展程序即可使用它们。实际上,Chrome将每个用户脚本都视为一个单独的插件,因此您可以轻松地管理和删除它们。

在互联网上有很多有关Greasemonkey的信息,包括许多教程。其中大多数将用于Greasemonkey起源的Firefox,但今天它们也适用于Chrome。

作为负责“更多信息”的网站是sharethis.com。如果您将其阻止,则此操作应停止。如果您已安装安全套件,请使用它来阻止站点。否则,您可以使用hosts文件阻止它

sharethis.com是将Tynt提供给您给我的两个网站的提供商。Tynt看起来更像是一种技术而不是网站,因此当然可能还有其他此类提供商,但是必须希望它们会很少见。


好,谢谢。原则上,如果网站上应用了monkeymonkey脚本,则几乎可以修复网站上的任何内容。(至少,我认为可以用更多的JavaScript来解决任何Ja​​vaScript问题。)为了接受这个赏金的答案,我需要有关如何实现的更多信息。
杰西·里德尔

什么样的信息?可以从提供最重要链接的Wikipedia开始,包括wikiuserscripts.org
harrymc

说,对非Tynt实施如何工作的解释以及对它们的确切处理方式是什么?到目前为止,您编写的任何内容都还没有专门针对此复制粘贴问题(而不是一般的JavaScript)。
Jess Riedel 2014年

我从未见过Tynt(自从使用NoScript以来就不足为奇了)。在您链接到的文章中的两个示例网站中,一个消失了,另一个不再使用Tynt。你有例子吗?
harrymc

我进行了编辑,以添加两个示例网站,即使我使用Tynt阻止扩展程序,这些网站仍继续存在此行为。
杰西·里德尔

1

在Chromium上,我使用“ 绝对启用右键单击并复制”扩展程序获得了成功。

安装后,您可以在首选项中添加启用了扩展名的站点的用户列表。或者,当您在特定页面上并看到它篡改剪贴板时,可以通过其工具栏按钮即时启用此扩展程序(这会自动将网站添加到列表中)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.