Не допускати вибору тексту після подвійного клацання


294

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

Відповіді:


351
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 {
    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
Чи є спосіб реально запобігти вибору на відміну від видалення вибору після факту? Крім того, ваш другий, якщо заява може бути всередині іншого, якщо для кращої читабельності.
Девід

8
Найкраще використовувати префікс -webkit- (це кращий префікс для веб-браузерів) на додаток до -moz- (і -khtml-, якщо у вас є велика аудиторія Konqueror).
безвічність

3
Це тепер доступне в IE10, як -ms-user-select: none;дивіться blogs.msdn.com/b/ie/archive/2012/01/11/… @PaoloBergantino
лимон

1
@TimHarper: Що стосується рішень Javascript, що використовують бібліотеку, то обов'язково. Не дуже впевнений, чому це вимагає протистояння.
Паоло Бергантіно

14
Існує різниця між відключенням вибору при подвійному клацанні та відключенням його повністю. Перший збільшує юзабіліті. Друга зменшується.
Robo Robok

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
Це порушує елементи textarea на сторінці :(
John ktejik

1
@johnktejik, тільки якщо elementце текста , так.
fregante

11
Очікував би, що цей обробник подій призначить "dblclick" - але це не працює, що так дивно. З "mousedown" вам, звичайно, також заборонено вибирати текст шляхом перетягування.
corwin.amber

74

Щоб запобігти вибору тексту ТІЛЬКИ після подвійного клацання:

Ви можете використовувати MouseEvent#detailмайно. Для подій у миші та миші це 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


4
Це круто! Працює в Firefox 53.
Зарот

6
Це має бути прийнятою відповіддю. Все інше тут перешкоджає будь-якому вибору миші (або гірше) замість того, щоб відповідати на питання ОП " Запобігати вибору тексту після подвійного клацання "
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>

Дякую, перець 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Вихід продовжує працювати , як очікувалося.


3

або, на мозіллі:

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!


1

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

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


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;"(так що натискання на нього не додасть новий запис до історії браузера).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.