Jak mogę zapobiec zaznaczaniu tekstu / elementu za pomocą przeciągania kursora

83

Zrobiłem kontrolkę stronicowania i zauważyłem, że klikając na przyciski bardzo łatwo jest przypadkowo zaznaczyć poszczególne obrazy i tekst. Czy można temu zapobiec?

Aby wyjaśnić wybór, mam na myśli podświetlanie myszką. (Spróbuj przeciągnąć mysz z jednej strony ekranu na drugą.)

Jeśli spróbujesz zaznaczyć tekst / elementy sterujące w tej siatce, nie można ich wybrać. Jak to się robi? Połączyć

The Muffin Man
źródło

Odpowiedzi:

108

przeciąganie i wybieranie zarówno inicjowania po naciśnięciu myszy, jak i aktualizacji przy kolejnych ruchach myszy. Kiedy obsługujesz zdarzenia, aby rozpocząć przeciąganie lub podążać za myszą, anuluj propagację zdarzenia i nadpisz domyślny zwrot przeglądarki:

coś takiego w swoim początku przeciągania myszy w dół i przenoszenia uchwytów-

e=e || window.event;
pauseEvent(e);
function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}
kennebec
źródło
11
Tak, e.preventDefault () powinno być wszystkim, czego potrzebujesz w nowoczesnych przeglądarkach. Reszta kodu jest redundantna: window.event jest dla starszych wersji IE, ale ponieważ te zdarzenia nie mają metody prevDefault, a funkcja return false nie jest zwracana przy wywołaniu funkcji pauseEvent ... to nic nie robi (nawet nie w 2011).
Sjeiti
17
CSS: user-select: none;to jest to, czego używam. Myślę, że nie ma już potrzeby rozwiązywania tego problemu przez JS
Drenai,
53

Do przeciągania przechwytujesz zdarzenia mousedowni mousemove. (I miejmy nadzieję touchstarti touchmovewydarzeń, a także, do interfejsów dotykowych wsparcie).

Musisz zadzwonić event.preventDefault()w obu downi movewydarzeń w celu utrzymania przeglądarkę od wyboru tekstu.

Na przykład (używając jQuery):

var mouseDown = false;
$(element).on('mousedown touchstart', function(event) {
  event.preventDefault();
  mouseDown = true;
});
$(element).on('mousemove touchmove', function(event) {
  event.preventDefault();
  if(mouseDown) {
    // Do something here.
  }
});
$(window.document).on('mouseup touchend', function(event) {
  // Capture this event anywhere in the document, since the mouse may leave our element while mouse is down and then the 'up' event will not fire within the element.
  mouseDown = false;
});
Robin Daugherty
źródło
Dzięki Robin, z ciekawości, czy jest różnica między window.documenti windowczy po prostu document? Jestem prawie pewien, że documentjest dzieckiem window
The Muffin Man,
1
windowto najbardziej zewnętrzny zakres, w którym JavaScript działa w przeglądarce. Zatem każda zmienna, która nie została zadeklarowana wewnątrz funkcji, jest własnością window. Odwoływanie się documentbezpośrednio faktycznie odnosząc się window.document.
Robin Daugherty
4
O ile wiem, wystarczy anulować domyślne tylko zdarzenie „mousedown”.
drżenie
24

To jest bardzo stary post. Może nie odpowiadać dokładnie na tę sytuację, ale używam CSS do mojego rozwiązania:

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
Mikrofon
źródło
To było dokładnie to, czego potrzebowałem
Luc-Olsthoorn
19

Chciałem to skomentować, ale nie mam wystarczającej reputacji. Użycie sugerowanej funkcji z @kennebec rozwiązało mój problem w mojej bibliotece do przeciągania javascript. Działa bez zarzutu.

function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

nazwałem to w funkcji niestandardowej Mousedown i Mousemove, natychmiast po rozpoznaniu kliknięcia odpowiedniego elementu. Jeśli wywołuję to tuż obok funkcji, po prostu zabijam każde kliknięcie dokumentu. Moja funkcja jest zarejestrowana jako zdarzenie w witrynie document.body.

AndreaBogazzi
źródło
2
Masz teraz 10 więcej :)
Adaptabi
9

Spróbuj tego:

document.onselectstart = function()
{
    window.getSelection().removeAllRanges();
};
Alex Pacurar
źródło
1
spróbuj tego: $ ('yourDivSelector'). getSelection (). removeAllRanges ()
Alex Pacurar
1
selectstartWydarzenie nie istnieje w Firefoksie.
Tim Down,
0

po prostu temu zapobiegaj, wywołując funkcję blur () po wybraniu w następujący sposób:

 <input Value="test" onSelect="blur();">
Mehdi
źródło
0

Jeśli potrzebujesz zablokować zaznaczanie tekstu dla określonego elementu za pomocą JavaScript, to najprostszą metodą dla mnie było przypisanie stylu userSelect w następujący sposób:

var myElement = document.createElement('div');
myElement.style.userSelect = 'none';
Erkki Teedla
źródło