Как предотвратить вставку «Read more: www.site.com» не-Tynt JavaScript в действия копирования-вставки?

30

Есть много сайтов, которые вставляют что-то вроде «Read more: www.site.com» в буфер обмена, когда вы копируете текст в браузере. Я нахожу это отвратительным. Поиск Google показывает некоторые методы, чтобы остановить это, если веб-сайт использует службу Tynt (просто блокируя домен Tynt), но многие веб-сайты используют собственный JavaScript.

Есть ли общий способ заблокировать это поведение, кроме простого отключения JavaScript? Я использую Chrome, но меня интересуют все решения.

РЕДАКТИРОВАТЬ: Чтобы быть ясным, я хочу быть в состоянии сохранить остальные функции JavaScript для этих сайтов, так как многие обойдутся без него.

РЕДАКТИРОВАТЬ # 2: Вот два примера веб-сайтов, которые продолжают преследовать меня, несмотря на то, что я использую блокировщик Tynt: Marginal Revolution | Фискальные времена

Вот два вопроса StackOverflow и два сообщения в блоге, в которых объясняется, как реализовать эту неясную практику вручную без использования Tynt. Вот сообщение в блоге, описывающее, как трудно это надежно блокировать. Вот последнее обсуждение, которое я смог найти (март 2013 г.), в котором предлагаются предложения о том, как заблокировать это в Chrome с помощью AdBlock, но у меня это не сработало.

Джесс Ридель
источник

Ответы:

24

Сайт, добавляющий раздражающий материал «Читать дальше», - ShareThis.

Чтобы предотвратить это плохое поведение, у вас есть три различных варианта:

Отключить события буфера обмена

Эти веб-сайты используют API-интерфейсы Clipboard , которые позволяют веб-разработчикам перехватывать действия копирования / вырезания / вставки и выполнять некоторый код при их выполнении. Вот как работает ShareThis (и другие подобные сайты). Он просто ожидает события копирования и непосредственно перед выполнением эффективной копии добавляет дополнительный «слой» текста, который содержит раздражающее «- Смотрите ...».

Теперь вопрос: есть ли способ отключить события буфера обмена? К сожалению, я не смог найти способ сделать это в Chrome / Chromium, но в Firefox это возможно двумя разными способами.

  • Идите about:configи ищите dom.event.clipboardevents.enabled. Дважды щелкните по ключу (установите его false) и вуаля! Вы отключили события буфера обмена, и никто не будет снова трогать ваш буфер обмена.
  • Для более старых версий Firefox (действительно, очень старых) есть это расширение, которое делает то же самое с about:configопцией.

Отключение событий буфера обмена не должно повредить работе любого веб-сайта, так как они используются редко, и на самом деле нет цели использовать их (кроме спама).

Давайте перейдем ко второму решению.

Блок ShareThis

Если вам не нужен ShareThis, вы можете просто заблокировать w.sharethis.comдомен. Javascript, ответственный за загрузку ShareThis (и регистрацию ClipboardEvent), загружается с этого сайта.

Вы можете заблокировать его по-разному, от простого фильтра AdBlock до редактирования вашего хост-файла (здесь это не рассматривается и не связано, поскольку я не могу добавить больше ссылок из-за своей репутации).

Пример выполнения этого через hostsфайл:

127.0.0.1 w.sharethis.com

Третий вариант - самый сложный, и его следует использовать только в качестве крайней меры.

Отключить функцию выбора на проблемных сайтах

Для редактирования содержимого, которое копируется в буфер обмена, эти веб-сайты используют SelectionAPI, который позволяет им редактировать выборки на лету. Таким образом, решение состоит в том, чтобы полностью отключить любой вид 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);
})();

Чтобы это работало, вы должны создать новый скрипт Greasemonkey / Tampermonkey и настроить @includeдирективы. Вы можете поставить один сайт на строку, и это должно быть сделано, как @include http://bad.website.address/.

Я протестировал его на обоих сайтах, на которые вы ссылались, и он работает без проблем. Однако имейте в виду, что это может вызвать проблемы, поскольку Selections используются совершенно законными веб-сайтами (например, текстовые поля StackExchange используют их для вставки символа, когда вы нажимаете кнопку, в положение вашей каретки), поэтому вам следует включить этот пользовательский скрипт только на проблемных сайтах.

(обратите внимание, что вам может понадобиться удалить строки, начинающиеся с того, что //если вы создаете скрипт пользователя из меню Greasemonkey / Tampermonkey, они автоматически добавят его)

Объяснение usercript довольно простое. Во-первых, он определяет функцию с именем, disableSelectionsкоторая заменяет значение по умолчанию, document.getSelectionа window.getSelectionфункции - на функцию, которая просто возвращает содержащий объект { isCollapsed: true }. Зачем? Потому что ShareThis (я проверил в их коде JS) вызывает эту функцию и проверяет, установлено ли isCollapsedсвойство в true(если оно есть, это останавливает «отравление буфера обмена»). Другие веб-сайты, подобные этому, возможно, не будут выполнять эту проверку, но в результате просто вызовут ошибку, когда попытаются вызвать законную функцию Selectionобъекта.

Затем функция вводится в тело / заголовок / документ и будет автоматически выполняться. Вы можете задать вопрос: если Javascript позволяет переопределить (почти) каждую функцию, почему вы не переопределили addEventListenerфункцию, которая просто ничего не делает, когда событие копируется / вырезается / вставляется? Ответ довольно прост. Пользовательский скрипт выполняется в непросто предсказуемое время, это означает, что Javascript ShareThis может быть загружен раньше, чем пользовательский скрипт, и он ничего не сделает. Вместо этого, просто переопределив window.getSelectionфункцию, проблем не возникнет, поскольку эта функция вызывается только при выполнении копирования, и мы на 100% уверены, что при копировании текста пользовательский скрипт уже загружен.

Вывод

Лучшее и самое чистое решение, очевидно, первое, поскольку оно отключает практически бесполезный API.

Второй также действителен, но вы потеряете любую функцию ShareThis.

Третий - самый «взломанный», но в крайнем случае он может сработать.

Robertof
источник
Большое спасибо! Это отлично. Обидно, что это так сложно и не имеет идеального решения, но ваш ответ, кажется, является лучшей информацией, которая в настоящее время доступна в Интернете. Очень приятно наградить вас за вознаграждение.
Джесс Ридель
Да, я провел немало исследований, так как эта проблема коснулась и меня. Кстати, спасибо за вознаграждение - это поможет моему «новичку» StackExchange!
Робертоф
Re: первый, это блокирует сайты, где вы можете нажать кнопку, чтобы скопировать текст? Например, emojipedia.org/snowman . Опытным путем в Firefox это не похоже. Круто. Re: блокировка ShareThis, мой отладчик теперь показывает загрузку скриптов с поддоменов "l.sharethis.com" и "ws.sharethis.com". Поэтому я думаю, что единственное полное лекарство - это блокировка всего домена ShareThis.com, что не должно быть большой потерей. Спасибо @ Робертоф!
Конрад Мейер
Внимание: отключение событий буфера обмена может привести к неисправности некоторых сайтов. Например, это приводит к сбою Discord при вставке в поиск.
Николай
2

Эти одиозные действия можно заблокировать в Chrome с помощью расширения «Убить зло»:

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

(РЕДАКТИРОВАТЬ) Это расширение, кажется, вызывает странные проблемы на Facebook, обязательно внесите его в белый список.

чайка
источник
Превосходно! Я нашел три расширения, которые призваны решить эту проблему: 1. Tynt Blocker. 2. RightToCopy. 3. Убей зло (спасибо тебе, чайка). Kill Evil - это то, что исправляло особенно неприятные манипуляции с буфером обмена на phys.org,
Дэйв Бертон,
1
не беспокойтесь @DaveBurton - пожалуйста, обратите внимание, что это расширение приводит к тому, что многие сайты ведут себя довольно странно, поэтому включайте его только тогда, когда вам это нужно.
чайка
2
Kill Evil поддерживает список исключений или «белый список», который представляет собой список сайтов, для которых вы НЕ хотите, чтобы расширение было включено (т. Е. Список «разрешить зло»). Это было не то, что я хотел: я просто хочу включить Kill Evil ONLY на конкретном сайте (phys.org). Таким образом, я получил это хитрое регулярное выражение «отрицательный взгляд», чтобы отключить Kill Evil за исключением этого одного сайта: ^ https?: \ / \ / (?! ([A-zA-Z0-9 \ - \.] * phys \ .org))
Дейв Бертон,
Люблю нахальный кусочек регулярного выражения. Спасибо за публикацию.
чайка
1

Хотя это дополнение к Firefox, NoScript позволяет блокировать JavaScript с любого веб-сайта путем настройки ненадежного списка.

nonterrorist
источник
2
Спасибо за ответ, но это не то, что мне нужно. (Я хочу что-то, что не нарушает JavaScript везде на сайте.) Я отредактирую вопрос, чтобы быть более конкретным.
Джесс Ридель
1

Если вы ищете способ автоматического изменения HTML-кода перед его отображением, то Greasemonkey - это инструмент, и вам нужно будет создать пользовательский скрипт, который выполняет изменение.

Из статьи Руководство для начинающих для скриптов Greasemonkey в Google Chrome :

Chrome теперь изначально поддерживает пользовательские скрипты. Вам не нужно устанавливать дополнительное расширение, чтобы использовать их; фактически Chrome рассматривает каждый пользовательский скрипт как отдельное дополнение, поэтому вы можете легко управлять и удалять их.

В Интернете можно найти много информации о Greasemonkey, в том числе множество учебных пособий. Большинство из них были бы для Firefox, где возникла Greasemonkey, но они также применяются сегодня к Chrome.

Так как сайт отвечает за «Читать дальше» sharethis.com. Если вы заблокируете это, это должно прекратиться. Если у вас установлен пакет безопасности, используйте его для блокировки сайта. В противном случае вы можете заблокировать его, используя файл hosts .

sharethis.comявляется поставщиком, который поставляет Tynt на два сайта, которые вы мне дали. Tynt выглядит скорее технологией, чем веб-сайтом, поэтому, конечно, могут быть и другие подобные провайдеры, но нужно надеяться, что они будут довольно редкими.

harrymc
источник
Хорошо спасибо. В принципе все, что угодно на веб-сайте, можно исправить, если применить скрипт greasemonkey. (По крайней мере, я предполагаю, что любая проблема JavaScript может быть исправлена ​​с помощью большего количества JavaScript.) Чтобы принять этот ответ за вознаграждение, мне нужно гораздо больше информации о том, как его реализовать.
Джесс Ридель
Что за информация? Можно начать с Википедии, которая дает наиболее важные ссылки, включая вики и userscripts.org .
harrymc
Скажем, объяснение того, как работают не-Tynt реализации и что конкретно будет с ними делать? Пока что вы ничего не написали даже для этой проблемы копирования-вставки (в отличие от JavaScript в целом).
Джесс Ридель
Я никогда не встречал Tynt (неудивительно, так как я использую NoScript). Из двух примеров сайтов в статье, на которую вы ссылались, один исчез, а другой больше не использует Tynt. У вас есть пример?
harrymc
Я сделал правку, чтобы добавить два примера веб-сайтов, которые продолжают иметь такое поведение, даже когда я использую расширение Tynt-блокировки.
Джесс Ридель
1

На Chromium у меня был успех с расширением Absolute Enable Right Click & Copy .

Установив его, вы можете добавить свой список пользователей сайтов, где расширение включено в настройках. Или, когда вы находитесь на определенной странице и видите, что она вмешивается в ваш буфер обмена, вы можете включить это расширение на лету с помощью кнопки на панели инструментов (это автоматически добавит сайт в ваш список).

Руслан
источник
0

Также можно использовать расширение «Копировать как обычный текст» для Chrome. Затем у вас есть дополнительная опция в меню, кроме обычного копирования. С другой стороны, он работает в Chrome и ничего не ломает. https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog

юлианский
источник
Из названия, вы думаете, это нарушает копирование форматированного текста? Это иногда полезно для некоторых людей.
Конрад Мейер