Сайт, добавляющий раздражающий материал «Читать дальше», - 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.
Третий - самый «взломанный», но в крайнем случае он может сработать.