javascript: Вимкнути вибір тексту


84

Я використовую javascript, щоб вимкнути виділення тексту на моїй веб-сторінці.

Код:

<script type="text/JavaScript">

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
</script>

Подібний сценарій можна знайти тут

На моєму localhost: всі браузери (Firefox, Chrome, IE та Safari) чудово працюють.

На моєму веб-сайті в прямому ефірі: все нормально, окрім Firefox.

Мої запитання:

  1. Хтось має пропозицію щодо того, чому Firefox поводиться по-різному для веб-сайту та локального хосту. Примітка: Javascript увімкнено.

  2. Можливо, мій сценарій занадто спрощений, тому я спробував наступне з ТОЧНО ЖИМИ результатами


4
Дозвольте запропонувати вам уникати використання Javascript для цього випадку. Просто використовуйте CSS, ви можете знайти більше інформації про виділення тексту в CSS на це питання
RienNeVaPlu͢

Другий сценарій, ймовірно, занадто старий. Видаліть!
Document.all,

9
Я ненавиджу сайти, які роблять це. Якщо я хочу скопіювати якийсь текст, я можу відкрити інструменти розробника та скопіювати його в будь-якому випадку. Це просто непотрібні незручності.
uylmz

4
Саме так, як каже Рік. Не робіть цього, якщо у вас немає для цього поважних причин. Багато людей можуть просто захотіти вибрати щось для його пошуку або скористатися словником, щоб знайти слово. Якщо заборонити це, це просто роздратування, яке може в довгостроковій перспективі відвести людей від вашого сайту.
Чехологія

1
По-перше, я також ненавиджу Сторінки, які забороняють виділяти (текст та інше) лише для його "розваги", але я вважаю, що це хороше питання, оскільки є кілька законних причин для того, хто хоче його відключити ( наприклад , реалізувати жести миші або перетягування блоків тексту в грі чого завгодно). Звичайно, використовувати JS для досягнення цієї мети - це погано, але рішення CSS також має свої проблеми (у деяких браузерах user-selectлише один не працює, йому потрібен префікс "-vendor-", як -moz-user-selectі -webkit-user-select, отже, щоб він працював , необхідно встановити всі можливі варіації на none).
Cyberknight

Відповіді:


209

Просто використовуйте цей метод css:

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

Ви можете знайти ту саму відповідь тут: Як відключити виділення тексту виділенням за допомогою CSS?


6
Також додайте посилання звідки ви знайшли цю відповідь: stackoverflow.com/questions/826782/…
Рон ван дер Хейден

Дуже дякую. CSS в тілі працював для всіх випадків, крім IE. Чи є охайне рішення CSS, яке б також вирішило цю проблему для IE? Зараз я використовую комбінацію Js та CSS для охоплення всіх браузерів !! thk u.
арпеджіо

1. Чому цей asnwer не позначений як рішення? ... Він вирішує проблему, про яку йдеться, найбільш точним і простим способом. 2. Слід зазначити, що це визначення CSS може бути реалізовано на будь-якому елементі HTML, а не тільки на BODY.
TheCuBeMan

1
@TheCuBeMan "user-select" - це нестандартна функція, і IMO, отже, не найкраще рішення.
ndugger

1
Це, мабуть, найкращий підхід - браузери обробляють це по-різному, оскільки це складно, і всі вони мають різні думки. А саме, вони хочуть надати передбачуваний UX (без вибору), одночасно дозволяючи користувачеві вибрати, чи дійсно вони цього хочуть . У проекті W3C є більше приміток, а caniuse демонструє фантастичну підтримку. Нічого страшного, якщо браузери обробляють це по-різному - користувач отримає досвід, який надає улюблений браузер.
Шон Еркхарт,

25

Я пишу повзунок ui для забезпечення функції перетягування, це мій спосіб запобігти вибору вмісту під час перетягування користувачем:

function disableSelect(event) {
    event.preventDefault();
}

function startDrag(event) {
    window.addEventListener('mouseup', onDragEnd);
    window.addEventListener('selectstart', disableSelect);
    // ... my other code
}

function onDragEnd() {
    window.removeEventListener('mouseup', onDragEnd);
    window.removeEventListener('selectstart', disableSelect);
    // ... my other code
}

прив’язати startDragдо свого дому:

<button onmousedown="startDrag">...</button>

Якщо ви хочете статично вимкнути виділення тексту для всіх елементів, виконайте код під час завантаження елементів:

window.addEventListener('selectstart', function(e){ e.preventDefault(); });

      

2
Це найкраще рішення, оскільки рішення CSS не працює для div з contenteditableатрибутом (наприклад, якщо ви хочете відключити виділення тексту, поки елемент керування змінюється за допомогою миші користувача).
mbomb007

11

Для JavaScript використовуйте цю функцію:

function disableselect(e) {return false}
document.onselectstart = new Function (return false)
document.onmousedown = disableselect

щоб увімкнути вибір, використовуйте це:

function reEnable() {return true}

і використовуйте цю функцію де завгодно:

document.onclick = reEnable

Крім того, new Function (return false)це не дійсний код JavaScript. Використовуйте просто document.onselectstart = disableselect.
amik

@amik як щодо цього: document.oncontextmenu = new Function("return false;");або цього за допомогою CSS:<body onselectstart="return false">
Хасан Азімі

Так new Function("return false;")би працювало, але є надмірно складним у порівнянні з тим, як просто використовувати те, disableselectщо у вас вже є. onselectstart="return false"також буде працювати, але не має нічого спільного з CSS. Також я помітив, що решта ваших відповідей теж неправильна - reEnableфункція взагалі не працювала.
amik

@amik ха-ха ну нічого не потрібно в JavaScript, але ми все одно це робимо. Звичайно, код можна змінити, але погляньте на запитання, відповідь, відповідь на запитання, не намагаючись робити домашнє завдання.
Хасан Азімі,

Ну, але SO - це місце для освіти, тому я вважаю, що відповісти, яка є технічно помилковою і взагалі не пояснювальною, є не дуже хорошою ідеєю.
amik

4

Якщо у вас є така HTML-сторінка:

    <тіло
    onbeforecopy = "повернути false"
    ondragstart = "повернути false" 
    onselectstart = "повернути false" 
    oncontextmenu = "повернути false" 
    onselect = "document.selection.empty ()" 
    oncopy = "document.selection.empty ()">

Існує простий спосіб відключити всі події:

document.write(document.body.innerHTML)

Ви отримали HTML-вміст і загубили інші речі.


4

Можна також використовувати, працює нормально у всіх браузерах, потрібен javascript:

onselectstart = (e) => {e.preventDefault()}

Приклад:

onselectstart = (e) => {
  e.preventDefault()
  console.log("nope!")
  }
Select me!


Ще одна альтернатива js, протестувавши підтримку CSS та відключивши userSelect, або MozUserSelectдля Firefox.

let FF
if (CSS.supports("( -moz-user-select: none )")){FF = 1} else {FF = 0}
(FF===1) ? document.body.style.MozUserSelect="none" : document.body.style.userSelect="none"
Select me!


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

@supports (user-select:none) {
  div {
    user-select:none
  }
}

@supports (-moz-user-select:none) {
  div {
    -moz-user-select:none
  }
}
<div>Select me!</div>


0

Простий Скопіюйте цей текст і поставте на попередньому </body>

function disableselect(e) {
  return false
}

function reEnable() {
  return true
}

document.onselectstart = new Function ("return false")

if (window.sidebar) {
  document.onmousedown = disableselect
  document.onclick = reEnable
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.