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

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

很多网站会在你从浏览器中复制文本时,将“阅读更多:www.site.com”之类的内容插入到剪贴板中。我觉得这太可恶了。谷歌搜索显示一些 方法如果网站恰好使用该服务,则停止此操作泰恩特(仅通过阻止 Tynt 域名),但许多网站使用自主开发的 JavaScript。

除了关闭 JavaScript 之外,还有其他通用方法可以阻止此行为吗?我使用 Chrome,但我对所有解决方案都感兴趣。

需要明确的是,我希望能够保留这些网站其余的 JavaScript 功能,因为如果没有这些功能,许多网站就会崩溃。

以下是两个示例网站,尽管我使用了 Tynt 拦截器,但它们仍继续骚扰我:边际革命|财政时报

以下是两个堆栈溢出 问题和两个博客 帖子解释了如何在没有 Tynt 的情况下手动实施这种不正当的做法。下面是博客文章描述可靠地阻止这一情况有多困难。以下是最近的讨论我找到了(2013 年 3 月)关于如何在 Chrome 中使用以下方法阻止此问题的建议广告拦截器,但它对我不起作用。

答案1

网站添加了令人厌烦的“阅读更多”内容分享这个

为了防止这种不良行为,您有三种不同的选择:

禁用剪贴板事件

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

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

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

禁用剪贴板事件不会损害任何网站的体验,因为它们很少使用,而且没有真正的使用目的(除了发送垃圾邮件)。

让我们讨论第二个解决方案。

阻止 ShareThis

如果您不需要 ShareThis,您可以直接屏蔽该w.sharethis.com域名。负责加载 ShareThis(并注册)的 JavascriptClipboardEvent是从该网站加载的。

您可以通过不同的方式来阻止它,从简单的 Adblock 过滤器到编辑您的主机文件(由于我的声誉问题,我无法放置更多链接,因此这里没有介绍或链接)。

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

127.0.0.1 w.sharethis.com

第三种解决方案是最难的,只能作为最后的手段。

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

为了编辑复制到剪贴板的内容,这些网站使用 APISelection来即时编辑选择。因此,解决方案是完全地禁用任何类型Selection(显然是在代码方面。您仍然可以执行选择)。

这可以通过一个简单的坦普猴或者油脂猴脚本。我只在 Firefox 上测试了它,因为我现在无法安装 Chrome。对此我很抱歉。

这是源代码:

// ==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 是由完全合法的网站使用的(例如,当您单击按钮时,Stack Exchange 文本框会使用它们在插入符号的位置插入符号),因此您应该只在有问题的网站上启用该用户脚本。

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

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

然后,该函数被注入到 body/header/document 中,它将自动执行。你可能会问:如果 JavaScript 允许覆盖(几乎)每个函数,那么为什么不覆盖该addEventListener函数,在复制/剪切/粘贴事件发生时什么也不做呢?答案很简单。用户脚本的执行时间很难预测,这意味着 ShareThis JavaScript 代码可以加载用户脚本,它不会做任何事情。相反,只要覆盖该window.getSelection函数就不会出现任何问题,因为该函数被调用仅有的当执行复制时,我们 100% 确定当您复制文本时,用户脚本已经被加载。

结论

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

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

第三个是最“黑客”的一个,但作为最后的手段,它可以起作用。

答案2

可以使用 Chrome 上的“Kill Evil”扩展程序阻止这些令人憎恶的操作:

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

此扩展似乎会在 Facebook 上引起奇怪的问题,因此请务必将其列入白名单。

答案3

在 Chromium 上我成功了绝对启用右键单击并复制扩大。

安装后,您可以在偏好设置中添加启用了此扩展的站点的用户列表。或者,当您在某个页面上看到它篡改了您的剪贴板时,您可以通过其工具栏按钮即时启用此扩展(这会自动将站点添加到您的列表中)。

答案4

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

来自文章Google Chrome 中的 Greasemonkey 脚本新手指南

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

互联网上有很多关于 Greasemonkey 的信息,包括很多教程。其中大部分是针对 Firefox(Greasemonkey 的起源),但它们现在也适用于 Chrome。

因为负责“阅读更多”的网站是sharethis.com。如果你阻止它,这种情况应该会停止。如果你安装了安全套件,请使用它来阻止该网站。否则你可以使用你的 hosts 文件阻止它

sharethis.com是向你提供的两个网站提供 Tynt 的提供商。Tynt 看起来更像是一种技术而不是一个网站,因此当然可能还有其他这样的提供商,但人们不得不希望它们会相当罕见。

相关内容