使用JavaScript清除文本选择

时间:2010-07-03 00:14:50

标签: javascript jquery

我无法找到答案的简单问题:如何使用JavaScript(或jQuery)取消选择可在网页上选择的任何文本?例如。用户点击和拖动以突出显示一些文本 - 我希望有一个deselectAll()函数清除此选择。我该怎么写呢?

感谢您的帮助。

7 个答案:

答案 0 :(得分:183)

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

Credit to Mr. Y.

答案 1 :(得分:44)

最好直接测试您想要的功能:

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

答案 2 :(得分:13)

2014年选择事务状况

我做了一些自己的研究。这是我写的和现在使用的功能:

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

基本上,所有现代浏览器(包括IE9 +)目前都支持getSelection().removeAllRanges()。这显然是向前发展的正确方法。

兼容性问题占:

  • 使用getSelection().empty()
  • 的旧版Chrome和Safari
  • IE8及以下版本使用document.selection.empty()

更新

将这个选择功能包装起来以供重复使用可能是一个好主意。

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

我已将其设为社区维基,以便您可以为此添加功能,或在标准发展时更新内容。

答案 3 :(得分:4)

2021 年答案

  • removeAllRanges()大多数浏览器支持,但 macOS 或 iOS 上的 Safari 除外。

  • empty()removeAllRanges() 的别名,由 all browsers 支持,包括非常老的,IE 除外。这个别名是 defined in the specification,所以应该是安全的。

结论

只需使用 getSelection().empty()。不需要其他答案中的辅助函数、嵌套的三元 if、构造函数和诸如此类的 Ninja banzai。十年前也许需要,但现在不需要了。

如果您确实需要 IE 支持,您可以测试 document.selection

(window.getSelection ? window.getSelection() : document.selection).empty()

(未在 IE 上测试)

答案 4 :(得分:1)

以下是已接受的答案,但有两行代码:

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

我没有做的唯一检查是removeAllRanges的存在 - 但AFAIK没有浏览器有window.getSelectiondocument.selection没有该属性的.empty.removeAllRanges

答案 5 :(得分:0)

window.getSelection()允许您访问所选文本,从那里,您可以执行一些操作来操作它。

阅读更多:Developer Mozilla DOM Selection

答案 6 :(得分:-1)

将此内容添加到脚本中,以防止右键单击和选择文本。

可以将异常添加到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;}