Ngăn chặn lựa chọn văn bản sau khi nhấp đúp


294

Tôi đang xử lý sự kiện dblclick trên một nhịp trong ứng dụng web của mình. Một tác dụng phụ là nhấp đúp chọn văn bản trên trang. Làm thế nào tôi có thể ngăn chặn lựa chọn này xảy ra?

Câu trả lời:


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

Bạn cũng có thể áp dụng các kiểu này cho nhịp cho tất cả các trình duyệt không phải IE và IE10:

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
Có cách nào để thực sự ngăn chặn sự lựa chọn trái ngược với việc loại bỏ lựa chọn sau thực tế không? Ngoài ra, câu lệnh if thứ hai của bạn có thể nằm bên trong câu lệnh khác nếu để dễ đọc hơn.
David

8
Tốt nhất nên sử dụng tiền tố -webkit- (đây là tiền tố ưa thích cho các trình duyệt dựa trên Webkit) ngoài -moz- (và -khtml- nếu bạn có đối tượng Konqueror lớn).
mí mắt

3
Đây là bây giờ đã có trong IE10 như -ms-user-select: none;see blogs.msdn.com/b/ie/archive/2012/01/11/... @PaoloBergantino
chanh

1
@TimHarper: Theo như các giải pháp Javascript sử dụng thư viện, chắc chắn. Không thực sự chắc chắn tại sao điều đó đảm bảo một downvote.
Paolo Bergantino

14
Có một sự khác biệt giữa vô hiệu hóa lựa chọn khi nhấp đúp chuột và vô hiệu hóa nó hoàn toàn. Việc đầu tiên làm tăng khả năng sử dụng. Thứ hai giảm.
Robo Robok

112

Trong javascript đơn giản:

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

Hoặc với jQuery:

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

26
Đúng, tôi đã sử dụng điều này để giải quyết vấn đề tương tự mà tôi gặp phải (+1), ngoại trừ thay vì return falsesử dụng event.preventDefault()mà không giết bất kỳ trình xử lý nào khác mà bạn có thể có trong mousedown.
Simon East

2
Điều này phá vỡ các yếu tố textarea trên trang :(
john ktejik

1
@johnktejik chỉ khi elementlà một textarea, vâng.
fregante

11
Sẽ mong muốn trình xử lý sự kiện này được gán cho "dblclick" - nhưng điều đó không hiệu quả, điều này thật kỳ lạ. Với "mousedown", tất nhiên bạn cũng bị ngăn không cho chọn văn bản bằng cách kéo.
corwin.amber

74

Để ngăn chặn lựa chọn văn bản CHỈ sau khi nhấp đúp chuột:

Bạn có thể sử dụng MouseEvent#detailtài sản. Đối với các sự kiện mousedown hoặc mouseup, nó là 1 cộng với số lần nhấp hiện tại.

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);

Xem https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail


4
Điều này thật tuyệt! Hoạt động trong Firefox 53.
Zaroth

6
Đây phải là câu trả lời được chấp nhận. Mọi thứ khác ở đây đều ngăn chặn mọi lựa chọn chuột (hoặc tệ hơn) thay vì trả lời câu hỏi của OP " Ngăn chặn lựa chọn văn bản sau khi nhấp đúp chuột "
billynoah

1
Cũng hoạt động trong Chrome
KS74

1
Cũng hoạt động trên IE 11 Windows 10 =). Cảm ơn đã chia sẻ điều này.
Fernando Vieira

Sử dụng (event.detail === 2)để thực sự ngăn chặn CHỈ nhấp đúp chuột (và không nhấp ba lần, v.v.)
Robin Stewart

32

FWIW, tôi đặt user-select: nonevào yếu tố phụ huynh của những phần tử con mà tôi không muốn bằng cách nào đó được lựa chọn khi tăng gấp đôi bất cứ nơi nào click vào yếu tố phụ huynh. Và nó hoạt động! Điều thú vị là contenteditable="true", lựa chọn văn bản và vv vẫn hoạt động trên các yếu tố con!

Vì vậy, như:

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

Cảm ơn, tiêu style="user-select: note"ở khắp mọi nơi đã sắp xếp vấn đề tôi đang cố gắng giải quyết :)
esaruoho

Giải pháp chỉ css đẹp cho các trường hợp về cơ bản bạn không bao giờ muốn văn bản có thể được chọn. Cảm ơn!
Ian Lovejoy

11

Một hàm Javascript đơn giản làm cho nội dung bên trong phần tử trang không thể chọn:

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

Đối với những người tìm kiếm một giải pháp cho Angular 2+ .

Bạn có thể sử dụng mousedownđầu ra của ô bảng.

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

Và ngăn chặn nếu 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 ...
}

Đầu dblclickra tiếp tục hoạt động như mong đợi.


3

hoặc, trên mozilla:

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

Trên IE,

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

5
Điều này hoàn toàn không cho phép chọn văn bản.
jmav

1
@jmav Bạn sẽ phải áp dụng chức năng ghi đè lên một yếu tố cụ thể hơn document.body.
Cypher

2

Chủ đề cũ, nhưng tôi đã đưa ra một giải pháp mà tôi tin là sạch hơn vì nó không vô hiệu hóa mọi ràng buộc ngay cả đối tượng và chỉ ngăn các lựa chọn văn bản ngẫu nhiên và không mong muốn trên trang. Nó là đơn giản, và làm việc tốt cho tôi. Đây là một ví dụ; Tôi muốn ngăn lựa chọn văn bản khi tôi nhấp nhiều lần vào đối tượng với lớp "mũi tên phải":

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

HTH!


1

Nếu bạn đang cố gắng ngăn chặn hoàn toàn việc chọn văn bản bằng bất kỳ phương pháp nào cũng như chỉ với một lần nhấp đúp, bạn có thể sử dụng user-select: nonethuộc tính css. Tôi đã thử nghiệm trong Chrome 68, nhưng theo https://caniuse.com/#search=user-select nó sẽ hoạt động trong các trình duyệt người dùng thông thường hiện tại khác.

Về mặt hành vi, trong Chrome 68, nó được kế thừa bởi các phần tử con và không cho phép chọn văn bản chứa phần tử ngay cả khi văn bản bao quanh và bao gồm phần tử được chọn.


0

Để ngăn IE 8 CTRL và SHIFT bấm vào lựa chọn văn bản trên từng phần tử riêng lẻ

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

Để ngăn chặn lựa chọn văn bản trên tài liệu

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

-2

Tôi đã từng gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách chuyển sang <a>và thêm onclick="return false;"(để nhấp vào nó sẽ không thêm mục mới vào lịch sử trình duyệt).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.