Як я можу запобігти виділенню тексту / елемента за допомогою перетягування курсору


83

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

Для уточнення вибору я маю на увазі виділення за допомогою миші. (Спробуйте перетягнути мишу з одного боку екрана на інший.)

Якщо ви намагаєтеся виділити текст / елементи керування в цій сітці, його неможливо вибрати. Як це робиться? Посилання


можливий дублікат stackoverflow.com/questions/2700000/…
Капа

інший можливий дублікат stackoverflow.com/questions/2326004/prevent-selection-in-html
Javi R

Відповіді:


108

перетягування та вибір як ініціалізації події миші вниз, так і оновлення при наступних переміщеннях миші. Коли ви обробляєте події, щоб розпочати перетягування або слідувати миші, скасуйте спливаючу підказку події та перевизначте повернення браузера за замовчуванням:

щось подібне у вашому розпочатому перетягуванні миші та переміщенні обробників-

e=e || window.event;
pauseEvent(e);
function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

11
Так, e.preventDefault () - це все, що вам потрібно в сучасних браузерах. Решта коду зайва: window.event призначений для старих версій IE, але оскільки ці події не мають методу prevenDefault, а повернення false не повертається при виклику функції pauseEvent ... він нічого не робить (навіть у 2011 році).
Sjeiti

17
CSS: user-select: none;це те, що я використовую. Не потрібно, щоб JS вирішував це більше, я повинен подумати
Дренай

53

Для перетягування ви фіксуєте події mousedownта mousemove. (І, сподіваємось, touchstartі touchmoveподії також, для підтримки сенсорних інтерфейсів.)

Вам потрібно буде зателефонувати event.preventDefault()як за допомогою подій, так downі moveдля того, щоб не дати браузеру вибрати текст.

Наприклад (за допомогою jQuery):

var mouseDown = false;
$(element).on('mousedown touchstart', function(event) {
  event.preventDefault();
  mouseDown = true;
});
$(element).on('mousemove touchmove', function(event) {
  event.preventDefault();
  if(mouseDown) {
    // Do something here.
  }
});
$(window.document).on('mouseup touchend', function(event) {
  // Capture this event anywhere in the document, since the mouse may leave our element while mouse is down and then the 'up' event will not fire within the element.
  mouseDown = false;
});

Спасибі Робін, з цікавості є різниця між window.documentі windowчи просто document? Я майже впевнений document, що це дитина window..
The Muffin Man

1
window- це сама зовнішня сфера, в якій Javascript працює в браузері. Отже, будь-яка змінна, не оголошена всередині функції, є властивістю window. Посилання documentбезпосередньо фактично стосується window.document.
Робін Догерті,

4
Наскільки я можу сказати, достатньо скасувати дефолт лише для події "mousedown".
трембі

24

Це дуже стара публікація. Це може не відповісти точно в цій ситуації, але я використовую CSS для свого рішення:

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

Це було саме те, що мені було потрібно
Люк-Олстоурн

19

Я хотів прокоментувати, але у мене недостатньо репутації. Використання запропонованої функції від @kennebec вирішило мою проблему в моїй бібліотеці перетягування javascript. Це працює бездоганно.

function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

я зателефонував у моїй користувацькій функції mousedown і mousemove, одразу після того, як я розпізнав, що клацнув на потрібному елементі. Якщо я закликаю це просто поверх функції, я просто вбиваю будь-який клік на документі. Моя функція зареєстрована як подія на document.body.


2
Зараз у вас ще 10 :)
Адаптабі



0

просто запобігайте цьому, викликаючи функцію blur (), якщо вибрано наступне:

 <input Value="test" onSelect="blur();">

0

Якщо вам потрібно заблокувати виділення тексту для певного елемента за допомогою JavaScript, то найпростішим методом для мене було призначити стиль userSelect таким:

var myElement = document.createElement('div');
myElement.style.userSelect = 'none';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.