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

Jes*_*del 34 clipboard google-chrome javascript copy-paste

当您在浏览器中复制文本时,有许多站点会在剪贴板中插入诸如“阅读更多:www.site.com”之类的内容。我觉得这很可恶。如果网站恰好在使用Tynt服务(仅通过阻止 Tynt 域),谷歌搜索会揭示一些 阻止这种情况的方法,但许多网站使用自产的 JavaScript。

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

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

编辑#2:这里有两个示例网站,尽管我使用了 Tynt 拦截器,但它们继续骚扰我:Marginal Revolution |财政时报

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

Rob*_*tof 27

添加烦人的“阅读更多”内容的网站是 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

这可以通过一个简单的 Tampermonkey/Greasemonkey 脚本来完成。我仅在 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);
})();
Run Code Online (Sandbox Code Playgroud)

为了让它起作用,您应该创建一个新的 Greasemonkey/Tampermonkey 脚本并调整@include指令。您可以每行放置一个网站,并且必须像@include http://bad.website.address/.

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

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

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

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

结论

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

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

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