Запрет выделения текста после двойного щелчка - PullRequest
260 голосов
/ 19 мая 2009

Я обрабатываю событие dblclick для диапазона в моем веб-приложении. Побочным эффектом является то, что двойной щелчок выделяет текст на странице. Как я могу предотвратить этот выбор?

Ответы [ 11 ]

321 голосов
/ 19 мая 2009
function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    } else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}

Вы также можете применить эти стили к диапазону для всех браузеров не IE и IE10:

span.no_selection {
    -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+ */
}
105 голосов
/ 05 ноября 2010

В простом JavaScript:

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

Или с помощью jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });
43 голосов
/ 10 апреля 2017

Чтобы запретить выделение текста ТОЛЬКО после двойного щелчка:

Вы можете использовать MouseEvent#detail свойство. Для событий mousedown или mouseup это 1 плюс текущее количество кликов.

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

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

12 голосов
/ 27 декабря 2018

FWIW, я установил user-select: none для родительского элемента из тех дочерних элементов, которые я не хочу каким-либо образом выбирать при двойном щелчке в любом месте родительского элемента. И это работает! Классная вещь - contenteditable="true", выделение текста и т. Д. Все еще работает на дочерних элементах!

Так как:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>
12 голосов
/ 25 июля 2009

Простая функция Javascript, которая делает содержимое внутри элемента страницы недоступным для выбора:

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 голосов
/ 19 мая 2009

или, на mozilla:

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

в IE,

document.body.onmousedown = function() { return false; } // valid for any html object as well
2 голосов
/ 24 июня 2017

Старая тема, но я нашел решение, которое, как мне кажется, является более чистым, поскольку оно не отключает все, даже привязанные к объекту, а только предотвращает случайный и нежелательный выбор текста на странице. Это просто и хорошо работает для меня. Вот пример; Я хочу запретить выделение текста, если несколько раз щелкнуть объект с классом «стрелка вправо»:

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

HTH!

2 голосов
/ 19 ноября 2014

Чтобы запретить IE 8 CTRL и SHIFT, нажмите выделение текста на отдельном элементе

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

Для предотвращения выделения текста в документе

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}
1 голос
/ 10 апреля 2019

Для тех, кто ищет решение для Угловой 2 + .

Вы можете использовать mousedown вывод ячейки таблицы.

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

И предотвратить, если detail > 1.

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

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

Вывод dblclick продолжает работать, как и ожидалось.

1 голос
/ 10 августа 2018

Если вы пытаетесь полностью запретить выделение текста любым способом, а также только двойным щелчком, вы можете использовать атрибут user-select: none css. Я тестировал в Chrome 68, но в соответствии с https://caniuse.com/#search=user-select он должен работать в других современных браузерах обычных пользователей.

Поведенчески, в Chrome 68 он наследуется дочерними элементами и не позволяет выделять текст, содержащийся в элементе, даже если выбран текст, окружающий и включающий элемент.

...