Çift tıklamadan sonra metin seçimini önleme


294

Web uygulamamdaki bir yayında dblclick olayını kullanıyorum. Bir yan etki, çift tıklamanın sayfadaki metni seçmesidir. Bu seçimin gerçekleşmesini nasıl önleyebilirim?

Yanıtlar:


351
function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    } else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}

Bu stilleri tüm IE olmayan tarayıcılar ve IE10 için yayılma alanına da uygulayabilirsiniz:

span.no_selection {
    user-select: none; /* standard syntax */
    -webkit-user-select: none; /* webkit (safari, chrome) browsers */
    -moz-user-select: none; /* mozilla browsers */
    -khtml-user-select: none; /* webkit (konqueror) browsers */
    -ms-user-select: none; /* IE10+ */
}

44
Gerçekliğin ardından seçimi kaldırmanın aksine seçimi gerçekten önlemenin bir yolu var mı? Ayrıca, daha iyi okunabilirlik için ikinci if ifadeniz diğer içinde olabilir.
David

8
-Moz- (ve büyük bir Konqueror kitleniz varsa -webkit- öneki (Webkit tabanlı tarayıcılar için tercih edilen önektir) yanında en iyisi).
göz kapaksızlığı

3
Bu şekilde IE10 içinde artık kullanılabilir -ms-user-select: none;bkz blogs.msdn.com/b/ie/archive/2012/01/11/... @PaoloBergantino
limon

1
@TimHarper: Bir kütüphane kullanarak Javascript çözümlerine gelince. Bunun neden bir düşüş önerdiğinden emin değilim.
Paolo Bergantino

14
Çift tıklamayla seçimi devre dışı bırakmak ve tamamen devre dışı bırakmak arasında bir fark vardır. Birincisi kullanılabilirliği artırır. İkincisi azalır.
Robo Robok

112

Düz javascriptte:

element.addEventListener('mousedown', function(e){ e.preventDefault(); }, false);

Veya jQuery ile:

jQuery(element).mousedown(function(e){ e.preventDefault(); });

26
Evet, bunu , fareyle uğraşmış olabileceğiniz diğer işleyicileri öldürmeyenler yerine, yaşadığım aynı sorunu (+1) çözmek için return falsekullandım event.preventDefault().
Simon East

2
Sayfadaki textarea öğelerini kırar :(
john ktejik

1
@johnktejik sadece elementbir textarea ise, evet.
fregante

11
Bu olay işleyicisinin "dblclick" e atanmasını beklersiniz - ama bu işe yaramaz, ki bu çok garip. "Fareyle üzerine gelme" ile, elbette sürükleyerek metin seçmeniz de engellenir.
corwin.amber

74

SADECE çift tıklamanın ardından metin seçimini önlemek için:

MouseEvent#detailMülkü kullanabilirsiniz . Fareyle üzerine gelme veya fare ile oynama olayları için, 1 artı mevcut tıklama sayısıdır.

document.addEventListener('mousedown', function (event) {
  if (event.detail > 1) {
    event.preventDefault();
    // of course, you still do not know what you prevent here...
    // You could also check event.ctrlKey/event.shiftKey/event.altKey
    // to not prevent something useful.
  }
}, false);

Bkz. Https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail


4
Bu harika! Firefox
53'de

6
Bu kabul edilen cevap olmalı. Başka Burada her şey yerine "OP'ın soruyu cevaplamanın (ya da kötü) herhangi bir fare seçimini engelleyen çift tıklama sonra önle metin seçimini "
billynoah

1
Chrome'da da çalışır
KS74

1
IE 11 üzerinde de çalışır Windows 10 =). Bunu paylaştığın için teşekkürler.
Fernando Vieira

(event.detail === 2)SADECE çift tıklamayı (ve üçlü tıklatmayı vb. Değil) gerçekten önlemek için kullanın
Robin Stewart

32

FWIW, ben set user-select: noneiçin üst öğesine ben bir şekilde üst elemana zaman çift tıklandığında hiçbir yerinde seçilmesini istediğiniz olmayanları alt öğelerin. Ve çalışıyor! Güzel olan şey contenteditable="true", metin seçimi vb. Hala alt öğeler üzerinde çalışıyor!

Gibi:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>

Teşekkürler, biberli style="user-select: note"her yerde çözmeye çalıştığım sorunu
sıraladı

Temelde metnin seçilebilir olmasını istemediğiniz durumlar için güzel css-only çözüm. Teşekkürler!
Ian Lovejoy

11

Bir sayfa öğesinin içindeki içeriği seçilemez yapan basit bir Javascript işlevi:

function makeUnselectable(elem) {
  if (typeof(elem) == 'string')
    elem = document.getElementById(elem);
  if (elem) {
    elem.onselectstart = function() { return false; };
    elem.style.MozUserSelect = "none";
    elem.style.KhtmlUserSelect = "none";
    elem.unselectable = "on";
  }
}

4

Angular 2+ için çözüm arayanlar için .

mousedownTablo hücresinin çıktısını kullanabilirsiniz .

<td *ngFor="..."
    (mousedown)="onMouseDown($event)"
    (dblclick) ="onDblClick($event)">
  ...
</td>

Ve önlemek detail > 1.

public onMouseDown(mouseEvent: MouseEvent) {
  // prevent text selection for dbl clicks.
  if (mouseEvent.detail > 1) mouseEvent.preventDefault();
}

public onDblClick(mouseEvent: MouseEvent) {
 // todo: do what you really want to do ...
}

dblclickBeklendiği gibi çıktı çalışmalarına devam ediyor.


3

veya mozillada:

document.body.onselectstart = function() { return false; } // Or any html object

IE'de,

document.body.onmousedown = function() { return false; } // valid for any html object as well

5
Bu çözüm metin seçimine hiç izin vermez.
jmav

1
@jmav Fonksiyon geçersiz kılma işlemlerini daha özel bir öğeye uygulamanız gerekir document.body.
Cypher

2

Eski iş parçacığı, ancak nesneye bağlı her çift devre dışı bırakmaz ve sadece sayfadaki rastgele ve istenmeyen metin seçimlerini engellemediğinden daha temiz olduğuna inandığım bir çözüm buldum. Çok basit ve benim için iyi çalışıyor. İşte bir örnek; "Ok-sağ" sınıfı ile nesneyi birkaç kez tıklattığınızda metin seçimini önlemek istiyorum:

$(".arrow-right").hover(function(){$('body').css({userSelect: "none"});}, function(){$('body').css({userSelect: "auto"});});

HTH!


1

Herhangi bir yöntemle ve yalnızca çift tıklamayla metin seçimini tamamen önlemeye çalışıyorsanız, user-select: nonecss özniteliğini kullanabilirsiniz . Chrome 68'de test ettim, ancak https://caniuse.com/#search=user-select'e göre mevcut diğer normal kullanıcı tarayıcılarında çalışması gerekir.

Davranışsal olarak, Chrome 68'de alt öğeler tarafından devralınır ve öğeyi çevreleyen ve öğeyi içeren metin seçilse bile bir öğenin içerdiği metnin seçilmesine izin vermedi.


0

IE 8 CTRL ve SHIFT'i önlemek için tek tek öğedeki metin seçimini tıklatın

var obj = document.createElement("DIV");
obj.onselectstart = function(){
  return false;
}

Belgedeki metin seçimini önlemek için

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}

-2

Ben de aynı problemi yaşadım. Geçiş yaparak <a>ve ekleyerek çözdüm onclick="return false;"(böylece tıklamak tarayıcı geçmişine yeni bir giriş eklemeyecek).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.