2011-08-18 11 views
12

Niedawno natknąłem się na website that disabled text selection, uniemożliwiając komukolwiek łatwe kopiowanie i wklejanie tekstu. Mam bookmarklet, który wyłącza podobne próby blokowania menu kontekstowych przy użyciu JavaScript i zastanawiam się, czy byłoby możliwe zrobienie czegoś podobnego do zaznaczenia tekstu.Włączanie zablokowanego wyboru tekstu przy użyciu JavaScript

function disableSelection(target){ 
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false} 
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox 
    target.style.MozUserSelect="none" 
else //All other route (For Opera) 
    target.onmousedown=function(){return false} 
target.style.cursor = "default" 
} 

indziej funkcja jest wywoływana z disableSelection(document.body).

Rozwiązanie z mojego menu kontekstowego bookmarklet to również prawdopodobnie konieczne:

javascript:void(document.onmousedown=null); 
void(document.onclick=null); 
void(document.oncontextmenu=null) 

Wreszcie widziałem elsewhere on StackOverflow że CSS można również stosować:

-webkit-user-select: none; 
-khtml-user-select: none; 
-moz-user-select: none; 
-o-user-select: none; 
user-select: none; 

Czy istnieje metoda do walki wszystko od razu i zakończyć tę tyranię przez moją przeglądarkę? W jaki sposób mogę zarówno włączyć MozUserSelect/SelectStart dla wszystkich elementów i ustawić właściwości CSS?

+0

To było strasznie szybkie obniżenie ... jakiekolwiek wyjaśnienie? – Patrick

Odpowiedz

15

Zrobiłem ten sam problem w paskudnej aplikacji internetowej, z której muszę korzystać codziennie w pracy.

Próbował pisać własne bookmarkletu które overwride onselectstart obsługi zdarzeń, ale to nie działa, podobno z powodu dodatkowych reguł CSS, które musiały zostać zmodyfikowane.

Potem znalazłem Enable All Text Selection bookmarklet by Alan Hogan, który rozwiązał problem dla mnie. Jedynym problemem z bookmarkletem jest to, że nie obsługuje ramek/ramek iframe.

Dodatkowy bonus umożliwia również kliknięcie prawym przyciskiem myszy na stronach, które go blokują.

Utwórz zakładkę (np. Przeciągając ikonę po lewej stronie adresu URL dowolnej strony na pasek zakładek), kliknij prawym przyciskiem myszy i wybierz opcję Edytuj, zmień nazwę na znaczącą i wstaw następujący kod w adresie URL field:

javascript:(function(){function ats(){var styles='*,p,div{user-select:text !important;-moz-user-select:text !important;-webkit-user-select:text !important;}';jQuery('head').append(jQuery('<style />').html(styles));var allowNormal=function(){return true;};jQuery('*[onselectstart], *[ondragstart], *[oncontextmenu], #songLyricsDiv').unbind('contextmenu').unbind('selectstart').unbind('dragstart').unbind('mousedown').unbind('mouseup').unbind('click').attr('onselectstart',allowNormal).attr('oncontextmenu',allowNormal).attr('ondragstart',allowNormal);}function atswp(){if(window.jQuery){ats();}else{window.setTimeout(atswp,100);}}if(window.jQuery){ats();}else{var s=document.createElement('script');s.setAttribute('src','http://code.jquery.com/jquery-1.9.1.min.js');document.getElementsByTagName('body')[0].appendChild(s);atswp();}})(); 

Ma jednak ograniczenia polegające na tym, że nie będzie działać wewnątrz ramek zagnieżdżonych.


..btw, aby kod bookmarklet czytelny, Użyłem Bookmarkelt Builder w http://subsimple.com/bookmarklets/jsbuilder.htm - wystarczy wkleić tekst minified bookmarklet i kliknij przycisk Format; to narzędzie zaoszczędziło mi wiele czasu.

+0

Cieszę się, że było to pomocne - i dziękuję za udostępnienie linku do budowniczego bookmarkletu! –

+0

jeśli dodasz również document.oncontextmenu = null; to uzupełni. – albanx

+0

Aktualizacja: Ten kod źródłowy bookmarkletu jest ** na GitHub. ** Został ulepszony i zaktualizowany. Żądania pobrania są mile widziane! https://github.com/alanhogan/bookmarklets –

1

Witryny internetowe zawsze mogą znaleźć sposoby na bycie nieznośnym. Wszystko, co muszą zrobić, to umieścić przezroczyste obrazy nad rzeczami lub umieścić tekst w obrazach, a będziesz trochę spowolniony.

Zrezygnuj z martwienia się o to. Firefox 4+ zapewnia kontrolę nad kliknięciem prawym przyciskiem myszy, aby aplikacje nie mogły go odebrać. Jeśli uważasz, że strona jest tak nieprzyjemna, przestań z niej korzystać i wspieraj inną witrynę, która nie jest tak nieprzyjemna lub przestań próbować robić rzeczy, których nie chcesz. O ile strona nie jest zbudowana dynamicznie z JS, zawsze możesz uzyskać tekst ze źródła strony. Mówię, że powinieneś przestać używać stron, które Cię denerwują. Gdyby wszyscy to zrobili, musieliby zmienić sposób.

+0

Jestem świadomy, że zawsze mogę wyciągnąć tekst ze źródła. Miałem nadzieję napisać dla mnie bookmarklet, który rozwiązałby te problemy, gdy pojawiły się, podobnie jak bookmarklet kontekstowego przycisku, o którym wspomniałem. – Patrick

+0

Mówię ci, że prawdopodobnie potrafisz zidentyfikować konkretną technikę używaną do irytowania ciebie i znaleźć dla niej rozwiązanie, ale jest wiele sposobów na drażnienie, że nie jest możliwe, aby próbować aktywnie pracować wokół nich wszystkich. z góry. Naprawdę nie interesuje mnie znalezienie rozwiązania dla strony, do której się odwołujesz. To po prostu zbyt nieprzyjemne. Nie traktowałbym ich protekcjonalnie. – jfriend00

+0

Rzeczy, takie jak przezroczyste obrazy, można łatwo rozwiązać, wyłączając CSS strony; Zrobiłem bookmarklet, który "humanizuje" stronę, ustawiając standardowe kolory i rozmiary tekstu, a także wyłączając większość css. Umożliwi to na przykład zapisanie obrazu za przezroczystym gifem na flickr: https://gist.github.com/1485798 – ccpizza

2

Miał ten sam problem ze stroną internetową.

CSS nie może rozwiązać tego problemu, ponieważ w chwili wejścia w grę wchodzi Javascript, aby wybrać tekst.

Istnieją dwa sposoby rozwiązania tego problemu: 1) Wyłącz Javascript w przeglądarce internetowej. Sprawdź to w celach informacyjnych. http://browsers.about.com/od/googlechrome/ss/disable-javascript-chrome-windows.htm 2) Otwórz konsolę javascript. Używam chrome (click shift + command + C na Macu, f12 na Ubuntu i Windows)

skopiuj ten kod document.body.onselectstart = function() {return true;}; i wklej go w konsoli, a następnie naciśnij enter.

+0

Przyjęta odpowiedź nie działa dla mnie na chrome. Ale document.body.onslectstart załatwił sprawę. Dzięki! – dtroy

0

widziany te same irytujące JS i więcej w innym miejscu:

<script type="text/javascript" language="JavaScript"> 
function disableText(e){ 
    return false 
} 
function reEnable(){ 
    return true 
} 
//For browser IE4+ 
document.onselectstart = new Function ("return false") 

//For browser NS6 
if (window.sidebar){ 
    document.onmousdown = disableText 
    document.onclick = reEnable 
} 
</script> 
<script language="JavaScript1.2"> 
var msgpopup=""; 
function pmb(){ 
     if(alertVis == "1") alert(message); 
      if(closeWin == "1") self.close(); 
      return false; 
} 
function IE() { 
    if (event.button == "2" || event.button == "3"){pmb();} 
} 
function NS(e) { 
    if (document.layers || (document.getElementById && !document.all)){ 
      if (e.which == "2" || e.which == "3"){ pmb();} 
    } 
} 
document.onmousedown=IE;document.onmouseup=NS;document.oncontextmenu=new Function("alert(msgpopup);return false") 

</script> 
<script type="text/javascript"> 
function disableSelection(target){ 
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false} 
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox 
    target.style.MozUserSelect="none" 
else //All other route (For Opera) 
    target.onmousedown=function(){return false} 
target.style.cursor = "default" 
} 

</script> 

pamiętać, że wszystkie procedury obsługi zdarzeń są dołączone do document albo ręcznie disableSelection(document.body). Tak więc skrypt przywoływany przez @ alan-h, który pozwala na aktualizację zdarzeń myszy, musi zostać uruchomiony na dokumencie i dokumencie .body. (re: el.onselectstart = el.ondragstart = el.ondrag = el.oncontextmenu = el.onmousedown = el.onmouseup = function(){return true};)

Powiązane problemy