Witryna dodająca irytujące treści „Czytaj więcej” to ShareThis.
Aby zapobiec temu złemu zachowaniu, masz trzy różne alternatywy:
Wyłącz zdarzenia ze schowka
Strony te używają interfejsów API schowka , które pozwalają twórcom stron internetowych przechwytywać operacje kopiowania / wycinania / wklejania i wykonywanie niektórych kodów podczas ich wykonywania. Tak działa ShareThis (i inne podobne strony). Po prostu czeka na zdarzenie kopiowania i tuż przed wykonaniem efektywnej kopii dodaje dodatkową „warstwę” tekstu, która zawiera irytujące „- Zobacz ...”.
Teraz pytanie brzmi: czy istnieje jakiś sposób na wyłączenie zdarzeń schowka? Niestety nie udało mi się znaleźć metody, aby to zrobić w Chrome / Chromium, ale w Firefoksie jest to możliwe na dwa różne sposoby.
- Wejdź
about:config
i wyszukaj dom.event.clipboardevents.enabled
. Kliknij dwukrotnie klawisz (ustaw go na false
) i voila! Wyłączyłeś zdarzenia ze schowka i nikt nie dotknie twojego schowka ponownie.
- W starszych wersjach Firefoksa (naprawdę, naprawdę starszych) jest to rozszerzenie, które robi dokładnie to samo z
about:config
opcją.
Wyłączenie zdarzeń ze schowka nie powinno negatywnie wpłynąć na funkcjonowanie żadnej strony internetowej, ponieważ są one rzadko używane i tak naprawdę nie ma celu ich używania (poza spamowaniem).
Przejdźmy do drugiego rozwiązania.
Zablokuj ShareThis
Jeśli nie potrzebujesz ShareThis, możesz po prostu zablokować w.sharethis.com
domenę. Javascript odpowiedzialny za ładowanie ShareThis (i rejestrację ClipboardEvent
) jest ładowany z tej strony.
Możesz go zablokować na różne sposoby, od prostego filtra AdBlock do edycji pliku hosts (nie jest to omówione ani linkowane tutaj, ponieważ nie mogę umieścić więcej linków z powodu mojej reputacji).
Przykład zrobienia tego za pomocą hosts
pliku:
127.0.0.1 w.sharethis.com
Trzecie rozwiązanie jest najtrudniejsze i powinno być stosowane tylko w ostateczności.
Wyłącz funkcję wyboru na problematycznych stronach internetowych
Aby edytować zawartość kopiowaną do schowka, strony te używają Selection
interfejsu API, który pozwala im edytować zaznaczenia w locie. Tak więc rozwiązaniem jest całkowite wyłączenie dowolnego rodzaju Selection
(oczywiście po stronie kodu. Nadal będziesz mógł dokonywać selekcji).
Można to zrobić za pomocą prostego skryptu Tampermonkey / Greasemonkey. Testowałem to tylko w przeglądarce Firefox, ponieważ nie mogę teraz zainstalować Chrome. Przepraszam za to.
To jest kod źródłowy:
// ==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);
})();
Aby to zadziałało, należy utworzyć nowy skrypt Greasemonkey / Tampermonkey i dostosować @include
dyrektywy. Możesz umieścić jedną stronę internetową w linii i trzeba to zrobić tak @include http://bad.website.address/
.
Przetestowałem to na obu połączonych stronach i działa bez problemów. Należy jednak pamiętać, że może to powodować problemy, ponieważ Selection
s są używane przez doskonale uzasadnione strony internetowe (na przykład pola tekstowe StackExchange używają ich do wstawiania symbolu, po kliknięciu przycisku, do pozycji twojego karetki), więc powinieneś włączyć że użytkownicy tworzą skrypt tylko na problematycznych stronach internetowych.
(zwróć uwagę, że może być konieczne usunięcie linii zaczynających się od, //
jeśli tworzysz skrypt użytkownika z menu Greasemonkey / Tampermonkey, oni automatycznie go dodadzą)
Wyjaśnienie skryptu użytkownika jest dość proste. Najpierw definiuje funkcję o nazwie, disableSelections
która zastępuje wartość domyślną, document.getSelection
a window.getSelection
funkcje taką, która po prostu zwraca obiekt zawierający { isCollapsed: true }
. Czemu? Ponieważ ShareThis (sprawdziłem w kodzie JS) wywołuje tę funkcję i sprawdza, czy isCollapsed
właściwość jest ustawiona na true
(jeśli tak, to zatrzymuje „zatrucie schowka”). Inne strony tego typu mogą nie przeprowadzać tej kontroli, ale po prostu popełni błąd, gdy będą próbować wywołać legalną funkcję Selection
obiektu.
Następnie funkcja jest wstrzykiwana do treści / nagłówka / dokumentu i zostanie wykonana automatycznie. Pytanie, które możesz zadać, to: jeśli JavaScript pozwala zastąpić (prawie) każdą funkcję, dlaczego nie zastąpiłeś tej addEventListener
funkcji, aby po prostu nic nie robić, gdy zdarzenie jest kopiowane / wycinane / wklejane? Odpowiedź jest dość prosta. Skrypt użytkownika jest wykonywany w trudnym do przewidzenia czasie, co oznacza, że skrypt JavaScript ShareThis można załadować przed skryptem użytkownika i nic nie zrobi. Zamiast tego, po prostu nadpisując window.getSelection
funkcję, nie będzie żadnego problemu, ponieważ funkcja ta jest wywoływana tylko wtedy, gdy wykonywana jest kopia, a my jesteśmy w 100% pewni, że po skopiowaniu tekstu skrypt użytkownika został już załadowany.
Wniosek
Najlepsze i najczystsze rozwiązanie jest oczywiście pierwsze, ponieważ wyłącza praktycznie bezużyteczne API.
Drugi jest również ważny, ale utracisz dowolną funkcjonalność ShareThis.
Trzeci jest najbardziej „hacking”, ale w ostateczności może się udać.