Запрет выделения текста после двойного щелчка

294

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

Дэвид
источник

Ответы:

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

Вы также можете применить эти стили к span для всех браузеров не IE и 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
Есть ли способ на самом деле предотвратить выборку, а не удалить выборку по факту? Кроме того, ваш второй оператор if может быть внутри else if для лучшей читабельности.
Дэвид
8
Лучше всего использовать префикс -webkit- (это предпочтительный префикс для браузеров на основе Webkit) в дополнение к -moz- (и -khtml-, если у вас большая аудитория Konqueror).
век
3
Это теперь доступно в IE10 как -ms-user-select: none;см. Blogs.msdn.com/b/ie/archive/2012/01/11/… @PaoloBergantino
лимон
1
@TimHarper: Конечно, что касается решений Javascript, использующих библиотеку. Не совсем уверен, почему это оправдывает снижение.
Паоло Бергантино
14
Существует разница между отключением выделения по двойному щелчку и его полным отключением. Первое повышает удобство использования. Второе уменьшается.
Робо Робок
112

В простом JavaScript:

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

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

jQuery(element).mousedown(function(e){ e.preventDefault(); });
Том
источник
26
Да, я использовал это, чтобы решить ту же проблему, что и у меня (+1), за исключением того, что вместо return falseиспользованного, event.preventDefault()который не убивает никаких других обработчиков, которые могут возникнуть в mousedown.
Саймон Ист
2
Это разбивает текстовые элементы на странице :(
Джон Ктеджик
1
@johnktejik, только если текстовая область element, да.
fregante
11
Ожидается, что этот обработчик событий будет назначен на «dblclick» - но это не работает, что так странно. С «mousedown» вы, конечно, также не можете выбирать текст перетаскиванием.
corwin.amber
74

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

Вы можете использовать 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

4esn0k
источник
4
Это круто! Работает в Firefox 53.
Zaroth
6
Это должен быть принятый ответ. Все остальное здесь предотвращает любой выбор мыши (или хуже) вместо ответа на вопрос OP " Запретить выделение текста после двойного щелчка "
billynoah
1
Работает и в Chrome
KS74
1
Работает также на IE 11 Windows 10 =). Спасибо, что поделились этим.
Фернандо Виейра
Используйте, (event.detail === 2)чтобы действительно предотвратить ТОЛЬКО двойной щелчок (а не тройной щелчок и т. Д.)
Робин Стюарт
32

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

Так вроде:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>
KYW
источник
Спасибо, перченка style="user-select: note"повсюду разбирала проблему, которую я пытался решить :)
esaruoho
Хорошее решение только для CSS для случаев, когда вы в основном никогда не хотите, чтобы текст был выбираемым. Спасибо!
Ян Лавджой
11

Простая функция 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

Для тех, кто ищет решение для Angular 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) mouseEvent.preventDefault();
}

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

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

bvdb
источник
3

или на 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
Хосе Лил
источник
5
Это решение вообще не позволяет выделять текст.
Jmav
1
@jmav Вы должны применить переопределения функции к более конкретному элементу, чем document.body.
Cypher
2

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

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

HTH!

nncho
источник
1

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

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

stackuser83
источник
0

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

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

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

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}
Раджеш
источник
-2

У меня такая же проблема. Я решил это, переключившись на <a>и добавив onclick="return false;"(чтобы щелкнув по нему не добавить новую запись в историю браузера).

minhle_r7
источник