Сайт, добавляющий раздражающий материал «Читать дальше», - 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
Третий вариант - самый сложный, и его следует использовать только в качестве крайней меры.
Отключить функцию выбора на проблемных сайтах
Для редактирования содержимого, которое копируется в буфер обмена, эти веб-сайты используют 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);
})();
Чтобы это работало, вы должны создать новый скрипт Greasemonkey / Tampermonkey и настроить @include
директивы. Вы можете поставить один сайт на строку, и это должно быть сделано, как @include http://bad.website.address/
.
Я протестировал его на обоих сайтах, на которые вы ссылались, и он работает без проблем. Однако имейте в виду, что это может вызвать проблемы, поскольку Selection
s используются совершенно законными веб-сайтами (например, текстовые поля 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.
Третий - самый «взломанный», но в крайнем случае он может сработать.