Xóa lựa chọn văn bản bằng JavaScript


123

Câu hỏi đơn giản mà tôi không thể tìm ra câu trả lời: làm cách nào tôi có thể sử dụng JavaScript (hoặc jQuery) để bỏ chọn bất kỳ văn bản nào có thể được chọn trên một trang web? Người dùng EG nhấp và kéo để đánh dấu một chút văn bản - Tôi muốn có một hàm deselectAll () để xóa lựa chọn này. Tôi nên viết nó như thế nào?

Cảm ơn đã giúp đỡ.

Câu trả lời:


207
if (window.getSelection) {
  if (window.getSelection().empty) {  // Chrome
    window.getSelection().empty();
  } else if (window.getSelection().removeAllRanges) {  // Firefox
    window.getSelection().removeAllRanges();
  }
} else if (document.selection) {  // IE?
  document.selection.empty();
}

Tín dụng cho anh Y.


4
Điều này giả định rằng sự tồn tại của document.selectionnó bao hàm sự tồn tại của một empty()phương thức của nó. Bạn đã thử nghiệm phương pháp trong mọi trường hợp khác, vì vậy bạn cũng có thể thử nghiệm emptytrong trường hợp cuối cùng.
Tim Down

Đã sử dụng cái này trong plugin jquery.tableCheckbox.js của tôi , cảm ơn.
Marco Kerwitz

1
Tôi đã tạo một ví dụ hoạt động đầy đủ dựa trên đề xuất của bạn nhưng thêm một số tính năng bổ sung jsfiddle.net/mkrivan/hohx4nes Dòng quan trọng nhất là window.getSelection (). AddRange (document.createRange ()); Nếu không có điều này, IE không bỏ chọn văn bản trong một số điều kiện. Và tôi đã thay đổi thứ tự phát hiện phương pháp.
Miklos Krivan

Bạn cứu ngày của tôi, bạn của tôi! Tôi đang sử dụng bàn di chuột và khi cào toàn bộ trang đã được chọn và với tập lệnh tốt này, tôi bỏ chọn trang của mình trước khi sử dụng plugin bàn di chuột. Về cơ bản nó hoạt động! Cảm ơn rất nhiều!
Kết hợp

1
Tôi cho rằng nó window.getSelection().removeAllRanges();hoạt động tốt trong IE (edge) và Safari.
chile

48

Tốt nhất hãy kiểm tra trực tiếp các tính năng bạn muốn:

var sel = window.getSelection ? window.getSelection() : document.selection;
if (sel) {
    if (sel.removeAllRanges) {
        sel.removeAllRanges();
    } else if (sel.empty) {
        sel.empty();
    }
}

15

State of De-selection Affairs 2014

Tôi đã thực hiện một số nghiên cứu của riêng tôi. Đây là hàm tôi đã viết và đang sử dụng những ngày này:

(function deselect(){
  var selection = ('getSelection' in window)
    ? window.getSelection()
    : ('selection' in document)
      ? document.selection
      : null;
  if ('removeAllRanges' in selection) selection.removeAllRanges();
  else if ('empty' in selection) selection.empty();
})();

Về cơ bản, getSelection().removeAllRanges()hiện được hỗ trợ bởi tất cả các trình duyệt hiện đại (bao gồm cả IE9 +). Đây rõ ràng là phương pháp chính xác để tiến tới.

Các vấn đề về khả năng tương thích bao gồm:

  • Phiên bản cũ của Chrome và Safari được sử dụng getSelection().empty()
  • IE8 trở xuống được sử dụng document.selection.empty()

Cập nhật

Có lẽ bạn nên kết thúc chức năng lựa chọn này để sử dụng lại.

function ScSelection(){
  var sel=this;
  var selection = sel.selection = 
    'getSelection' in window
      ? window.getSelection()
      : 'selection' in document
        ? document.selection
        : null;
  sel.deselect = function(){
    if ('removeAllRanges' in selection) selection.removeAllRanges();
    else if ('empty' in selection) selection.empty();
    return sel; // chainable :)
  };
  sel.getParentElement = function(){
    if ('anchorNode' in selection) return selection.anchorNode.parentElement;
    else return selection.createRange().parentElement();
  };
}

// use it
var sel = new ScSelection;
var $parentSection = $(sel.getParentElement()).closest('section');
sel.deselect();

Tôi đã làm cho trang này trở thành wiki cộng đồng để mọi người của bạn có thể thêm chức năng cho cái này hoặc cập nhật mọi thứ khi các tiêu chuẩn phát triển.


7
Điều đó đang làm giống như câu trả lời của tôi. Không có gì thay đổi trong 4 năm.
Tim Down

3
Kinh khủng. Bạn không chỉ đánh cắp việc triển khai từ một người đăng khác theo nghĩa đen, mà còn hoàn toàn chuyển nó vào thùng rác về mặt cú pháp.
kamelkev

1

Đây là câu trả lời được chấp nhận, nhưng trong hai dòng mã:

var selection = window.getSelection ? window.getSelection() : document.selection ? document.selection : null;
if(!!selection) selection.empty ? selection.empty() : selection.removeAllRanges();

Kiểm tra duy nhất mà tôi không thực hiện là sự tồn tại của removeAllRanges - nhưng AFAIK không có trình duyệt nào có window.getSelectionhoặc document.selectionnhưng không.emptyhoặc .removeAllRangescho thuộc tính đó.



-1

thêm điều này vào tập lệnh của bạn để ngăn việc nhấp chuột phải và chọn văn bản.

Các ngoại lệ có thể được thêm vào var 'om'.

var d=document,om=['input','textarea','select'];;
function ie(){if(d.all){(mg);return false;}}function mz(e){if(d.layers||(d.getElementById&&!d.all)){if(e.which==2||e.which==3){(mg);return false;}}}if(d.layers){d.captureEvents(Event.mousedown);d.onmousedown=mz;}else{d.onmouseup=mz;d.oncontextmenu=ie;}d.oncontextmenu=new Function('return false');om=om.join('|');function ds(e){if(om.indexOf(e.target.tagName.toLowerCase())==-1);return false;}function rn(){return true;}if(typeof d.onselectstart!='undefined')d.onselectstart=new Function('return false');else{d.onmousedown=ds;d.onmouseup=rn;}
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.