Сайт, добавляющий раздражающий материал "Читать дальше", - 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
Третий вариант - самый сложный, и его следует использовать только в качестве крайней меры.
Отключить функцию выбора на проблемных сайтах
Для редактирования содержимого, которое копируется в буфер обмена, эти веб-сайты используют API Selection
который позволяет им редактировать выборки на лету. Таким образом, решение состоит в том, чтобы полностью отключить любой вид 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/
.
Я протестировал его на обоих сайтах, на которые вы ссылались, и он работает без проблем Однако имейте в виду, что это может вызвать проблемы, так как Selection
используются совершенно законными веб-сайтами (например, текстовые поля 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.
Третий - самый "взломанный", но в крайнем случае он может сработать.