2010-11-07 13 views
28

Wenn Sie auf eine HTML-Seite doppelklicken, wählen die meisten Browser das Wort aus, auf das Sie doppelklicken (oder auf den Absatz, auf den Sie dreifach klicken). Gibt es eine Möglichkeit, dieses Verhalten loszuwerden?JavaScript: Deaktivieren der Textauswahl per Doppelklick

Beachten Sie, dass ich die normale Auswahl nicht durch einfaches Klicken + Ziehen deaktivieren möchte; d. h. jQuery UI $('body').disableSelection() und das document.onselectstart DOM-Ereignis sind nicht was ich will.

+0

Warum möchten Sie das tun? –

+14

Nicht meine Entscheidung. Der Typ, für den ich schreibe, will es so. Wahrscheinlich, weil die Seite Teil eines Browsergames ist und einige Buttons (divs mit click-Ereignissen), die Werte erhöhen/verringern, den Benutzer dazu bringen, einen Doppelklick auszuführen, da dies schneller ist als ein einzelner Klick auf sie. Und wenn das Sachen auswählt, ist es nervig und sieht komisch aus. – ThiefMaster

+0

http://stackoverflow.com/questions/880512/prevent-text-selection-after-double-click – Aristoteles

Antwort

37

Ich fürchte, Sie die Auswahl nicht verhindern kann sich „native Verhalten“ des Browsers zu sein, aber Sie können die Auswahl an klar, nachdem es gemacht hat:

<script type="text/javascript"> 
document.ondblclick = function(evt) { 
    if (window.getSelection) 
     window.getSelection().removeAllRanges(); 
    else if (document.selection) 
     document.selection.empty(); 
} 
</script> 

bearbeiten: auch die Auswahl ganz zu verhindern Absatz von "triple Klick", hier ist der erforderliche Code:

var _tripleClickTimer = 0; 
var _mouseDown = false; 

document.onmousedown = function() { 
    _mouseDown = true; 
}; 

document.onmouseup = function() { 
    _mouseDown = false; 
}; 

document.ondblclick = function DoubleClick(evt) { 
    ClearSelection(); 
    window.clearTimeout(_tripleClickTimer); 

    //handle triple click selecting whole paragraph 
    document.onclick = function() { 
     ClearSelection(); 
    }; 

    _tripleClickTimer = window.setTimeout(RemoveDocumentClick, 1000); 
}; 

function RemoveDocumentClick() { 
    if (!_mouseDown) { 
     document.onclick = null; 
     return true; 
    } 

    _tripleClickTimer = window.setTimeout(RemoveDocumentClick, 1000); 
    return false; 
} 

function ClearSelection() { 
    if (window.getSelection) 
     window.getSelection().removeAllRanges(); 
    else if (document.selection) 
     document.selection.empty(); 
}​ 

Live test case.

Sollte Cross-Browser sein, melden Sie bitte jeden Browser, wo es nicht funktioniert.

+0

Danke, funktioniert gut. Obwohl ich eine anonyme Funktion verwendet habe, anstatt ihr einen Namen zu geben - ich sehe darin keinen großen Sinn, da sie sofort zugewiesen wird und wahrscheinlich nirgendwo anders verwendet wird. – ThiefMaster

+0

Prost, ich stimme dir mit anonymer Funktion zu, alles zu benennen ist nur eine alte (schlechte?) Gewohnheit von mir. :/ –

+0

aber es ist eine Angewohnheit, die Debuggern hilft, den Namen der Funktion zu kennen, wenn Sie auf den Stapel schauen, anstatt eine Reihe von anonym zu sehen. FF ist viel besser darin, Funktionsnamen zu erraten, IE zeigt anonym für die meisten meiner Stacks –

-1

Nur um das hier raus zu werfen, aber hier ist der Code, den ich auf meine Seiten gebe, wo ich erwarte, dass Benutzer schnell klicken. Dadurch wird jedoch auch die standardmäßige Click-n-Drag-Textauswahl deaktiviert.

document.body.onselectstart = function() { 
    return false; 
} 
document.body.style.MozUserSelect = "none"; 
if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) { 
    document.body.onmousedown = function() { 
     return false; 
    } 
} 

Scheint gut für mich zu arbeiten.

9

diese einfach auf den CSS-Abschnitt

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

Bitte lesen Sie die Frage noch einmal: *** Beachten Sie, dass ich die normale Auswahl nicht per Einfachklick + Ziehen *** – ThiefMaster

+1

deaktivieren möchte, das scheint perfekt zu funktionieren. kein Doppel. kein Tripel. keine Auswahl .. danke –

+0

@ThiefMaster sei nicht hart mit mir :) Ich weiß nicht Englisch und ich übe. Ich machte einen Fehler beim Lesen der Anfrage –

4

Wenn Sie wirklich wollen deaktivieren Auswahl auf einen Doppelklick auf und nicht nur entfernen Sie die Auswahl danach interessiert setzen (schaut zu mir hässlich), müssen Sie return false im zweiten mousedown-Ereignis (ondblclick funktioniert nicht, da die Auswahl auf mousedown erfolgt).

** Wenn jemand keine Auswahl haben möchte, ist die beste Lösung, CSS user-select : none; wie Maurizio Battaghini vorgeschlagen.

// set to true if you want to disable also the triple click event 
// works in Chrome, always disabled in IE11 
var disable_triple_click = true; 

// set a global var to save the timestamp of the last mousedown 
var down = new Date().getTime(); 
var old_down = down; 

jQuery(document).ready(function($) 
{ 
    $('#demo').on('mousedown', function(e) 
    { 
     var time = new Date().getTime(); 

     if((time - down) < 500 && 
     (disable_triple_click || (down - old_down) > 500)) 
     { 
      old_down = down; 
      down = time; 

      e.preventDefault(); // just in case 
      return false; // mandatory 
     } 

     old_down = down; 
     down = time; 
    }); 
}); 

Live demo here

Wichtiger Hinweis: I die Empfindlichkeit auf 500 ms gesetzt, aber Doppelklick Empfindlichkeit (maximale Zeit zwischen Klicks, die als Doppelklick erkannt wird) durch das Betriebssystem variieren und Browser und ist oft benutzerkonfigurierbar. - api.jquery.com

Getestet in Chrome und IE11.

2

Folgendes funktioniert für mich in den aktuellen Browsern Chrome (v56), Firefox (v51) und MS Edge (v38).

var test = document.getElementById('test'); 
 
test.addEventListener('mousedown', function(e){ 
 
    if (e.detail > 1){ 
 
     e.preventDefault(); 
 
    } 
 
});
<p id="test">This is a test area</p>

Die MouseEvent.detail Eigenschaft verfolgt die current click count, die verwendet werden können, um zu bestimmen, ob das Ereignis ein Doppel-, Drei oder mehr Klick.

Der Internet Explorer setzt den Zähler nach einer Zeitüberschreitung leider nicht zurück. Anstatt eine Anzahl von Burst-Klicks zu erhalten, wird gezählt, wie oft der Benutzer geklickt hat, seit die Seite geladen wurde.

+0

Nicht sicher, ob dies plötzlich erst vor kurzem möglich wurde, aber dies ist die einzige Antwort, die eine perfekte Lösung bietet. –

Verwandte Themen