Есть ли способ сделать текст недоступным для выбора на HTML-странице?

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

Возможно, я смогу решить эту проблему с помощью трюка с JavaScript (я бы тоже хотел увидеть эти ответы), но я очень надеюсь, что в CSS / HTML есть что-то, что работает во всех браузерах.

В зависимости от ваших потребностей, stackoverflow.com/q/4117466/298479 также может быть подходящим решением для вас.

ThiefMaster 10.05.2011 10:35

Хотя многие из перечисленных здесь примеров работают, имейте в виду, что ничто не мешает кому-то просто взглянуть на исходный код и скопировать текст.

Ren 16.09.2008 10:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
141
2
111 872
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Абсолютно расположите блоки div над текстовой областью с z-индексом выше и сделайте эти блоки прозрачным фоновым изображением Гифка.

Обратите внимание, после немного дополнительных размышлений - вам нужно будет связать эти «обложки», чтобы щелкнув по ним, вы переместились бы туда, где должна была находиться вкладка, что означает, что вы можете / должны сделать это с элементом привязки, установленным на display:box, ширина и высота, а также прозрачное фоновое изображение.

Это то, что делает flickr

Andrew Harry 21.03.2009 06:50

Такой взлом ужасен. Лично я бы этого избегал.

Doug 23.07.2010 06:29

Крошечная проблема с этим методом - это ссылки, как вы упомянули, и любые другие взаимодействия, которые вы хотите иметь с главным окном ...

Alexis Wilke 12.01.2016 12:35

Также можно выбирать изображения.

Есть ограничения на использование JavaScript для отмены выделения текста, поскольку это может произойти даже в тех местах, где вы хотите выделить. Чтобы обеспечить богатую и успешную карьеру, избегайте всех требований, которые требуют способности влиять на браузер или управлять им сверх обычного ... если, конечно, вам не платят очень хорошо.

Для Firefox вы можете применить объявление CSS «-moz-user-select» к «none». Ознакомьтесь с их документацией, выбор пользователя.

Это «предварительный просмотр» будущего «пользовательского выбора», как они говорят, так что, возможно, браузеры на основе Опера или WebKit будут поддерживать это. Еще помню, что нашел кое-что для Internet Explorer, но не помню, что именно :).

В любом случае, если это не конкретная ситуация, когда выделение текста приводит к сбою некоторых динамических функций, вам не следует действительно переопределять то, что пользователи ожидают от веб-страницы, а именно возможность выбрать любой текст, который они хотят.

Аналогично в Safari / Chrome / и т. д. -khtml-user-select: нет;

Brandon DuRette 23.02.2009 19:29

Но есть ли это в стандартах CSS?

Andrew Harry 21.03.2009 06:51

<script type = "text/javascript">

/***********************************************
* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code

***********************************************/


function disableSelection(target){

    if (typeof target.onselectstart! = "undefined") //IE route
        target.onselectstart=function(){return false}

    else if (typeof target.style.MozUserSelect! = "undefined") //Firefox route
        target.style.MozUserSelect = "none"

    else //All other route (ie: Opera)
        target.onmousedown=function(){return false}

    target.style.cursor = "default"
}



//Sample usages
//disableSelection(document.body) //Disable text selection on entire body
//disableSelection(document.getElementById("mydiv")) //Disable text selection on element with id = "mydiv"


</script>

РЕДАКТИРОВАТЬ

Код явно исходит от http://www.dynamicdrive.com

Есть ли какие-либо обновления для Opera или невозможность выбора элементов по-прежнему не поддерживается?

jayarjo 23.06.2010 21:27

Почему в последнем случае вы меняете стиль курсора на «по умолчанию»? В противном случае +1

HRJ 18.07.2010 15:58

Фактически, вы меняете его во всех случаях (отступ вводит в заблуждение)

HRJ 18.07.2010 15:59

Попробуй это:

<div onselectstart = "return false">some stuff</div>

Просто, но эффективно ... работает в текущих версиях всех основных браузеров.

У меня это не работает в firefox.

Tyler 05.09.2009 01:04

Это только атрибут IE. что делает его избыточным.

vsync 17.11.2009 11:03

Отлично работал для нашего приложения (мы нацелены только на пользователей IE).

Lee 12.10.2010 19:45

Это был единственный способ получить эффект, необходимый для выделения текста в IE11, при выделении с нажатой клавишей Shift в ag-Grid.

Mark Hughes 02.03.2017 12:54

Если это выглядит плохо, вы можете использовать CSS, чтобы изменить внешний вид выбранных разделов.

Для примера того, почему может быть желательно подавить выделение, см. SIMILE TImeline, который использует перетаскивание для исследования временной шкалы, во время которого случайное вертикальное движение мыши вызывает неожиданное выделение меток, что выглядит странно.

Я нахожу некоторый успех с описанным здесь CSS http://www.quirksmode.org/css/selection.html:

::selection {
    background-color: transparent;
}

Он решил большинство проблем, которые возникали у меня с некоторыми элементами ThemeRoller ul в приложении AIR (движок WebKit). По-прежнему получается небольшой (примерно 15 x 15) фрагмент небытия, который выбирается, но половина страницы была выбрана раньше.

Для Safari - -khtml-user-select: none, как и в Mozilla -moz-user-select (или, в JavaScript, target.style.KhtmlUserSelect = "none";).

Следующее работает в Firefox достаточно интересно, если я удалю строку записи, это не сработает. У кого-нибудь есть понимание, зачем нужна линия записи.

<script type = "text/javascript">
document.write(".");
document.body.style.MozUserSelect='none';
</script>

Я предполагаю, что тело может быть недоступно в DOM до того, как у него появится контент, поэтому вы не можете установить его стиль, прежде чем что-то напишете в документе.

Hubro 22.11.2010 14:17

Любой метод JavaScript или CSS легко обойти с помощью Firebug (как в случае с Flickr).

Вы можете использовать Псевдоэлемент ::selection в CSS, чтобы изменить цвет выделения.

Если вкладки являются ссылками и пунктирный прямоугольник в активном состоянии вызывает беспокойство, вы также можете удалить его (конечно, учитывайте удобство использования).

Ответ принят как подходящий

В большинстве браузеров этого можно добиться с помощью CSS:

*.unselectable {
   -moz-user-select: -moz-none;
   -khtml-user-select: none;
   -webkit-user-select: none;

   /*
     Introduced in IE 10.
     See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
   */
   -ms-user-select: none;
   user-select: none;
}

Для IE <10 и Opera вам нужно будет использовать атрибут unselectable элемента, который вы хотите отключить. Вы можете установить это с помощью атрибута в HTML:

<div id = "foo" unselectable = "on" class = "unselectable">...</div>

К сожалению, это свойство не наследуется, а это означает, что вам нужно поместить атрибут в начальный тег каждого элемента внутри <div>. Если это проблема, вы можете вместо этого использовать JavaScript, чтобы сделать это рекурсивно для потомков элемента:

function makeUnselectable(node) {
    if (node.nodeType == 1) {
        node.setAttribute("unselectable", "on");
    }
    var child = node.firstChild;
    while (child) {
        makeUnselectable(child);
        child = child.nextSibling;
    }
}

makeUnselectable(document.getElementById("foo"));

вы можете использовать этот селектор [unselectable = on] {...}, тогда вы не добавляете дополнительный класс

venimus 29.04.2011 22:33

Согласно dev.l-c-n.com/CSS3-selectors/browser-support.php, этот селектор должен поддерживаться в IE8 и выше и, возможно, IE7.

EricP 17.11.2011 09:14

@JoeCoder: Да, я считаю, что селекторы атрибутов работают в IE 7, но не в IE 6.

Tim Down 17.11.2011 13:23

Просто любопытно, есть ли преимущество в использовании * .unselectable перед .unselectable в таблице стилей?

undefined 07.02.2013 01:15

@BrianMortenson: Никаких: они эквивалентны. У меня есть очень старая привычка включать * в такой селектор, чтобы явно напомнить себе, что я сопоставляю все имена тегов. Однако я больше не нахожу это полезным, и теперь это просто привычка, так что я практически перестал этим заниматься.

Tim Down 07.02.2013 03:51

Забавно, что @TimDown собрал еще 113 репутации, скопировав свой ответ из дубликата этого вопроса. подождите! <клик> 114;)

ericsoco 03.07.2013 09:23

@ericsoco: Ага. Это интересный вопрос: если другие публиковали ответы, за которые люди голосуют, и я думаю, что у меня есть лучший ответ, следует ли мне его опубликовать? В конце концов, система по-прежнему позволяет людям находить, просматривать и голосовать за ответы на закрытые вопросы. Я не могу отрицать, что желание иметь репутацию иногда побуждало меня добавлять ответ на повторяющийся вопрос по теме домашнего животного, а не голосовать за его закрытие.

Tim Down 03.07.2013 12:27

Конечно, вы должны и, конечно же, должны публиковать свои ответы везде, где их можно найти. В конечном счете, суть ответа не в репутации, а в том, чтобы дать ответы там, где их можно найти. я только за. </OT>

ericsoco 04.07.2013 00:09

@venimus Я бы предпочел классы селекторам xpath, например [unselectable = on] в CSS. В jquery они хороши, если вы сначала сузитесь до непосредственного контейнера, но в CSS селекторы анализируются справа налево, так что это все еще общая проверка каждого элемента и каждого атрибута unselectable элемента с использованием механизма xpath-meh xpath. Точно так же, я полагаю, с API querySelector, который, как я предполагаю, обычно напрямую подключается к механизмам выбора CSS / xpath. Это может измениться со временем, когда браузеры найдут настройки производительности, но я определенно буду иметь это в виду при поддержке IE <= 8, возможно, <= 9.

Erik Reppen 02.10.2013 20:28

Возможно, вы правы, но я считаю, что ранняя оптимизация - зло. Также вам не понадобится JS, если вы используете [unselectable = on] * {...}

venimus 03.10.2013 20:09

@venimus: вы не можете избежать JS, если хотите поддерживать IE <= 9 и не хотите помещать unselectable = "on" в каждый элемент. Все, что вы можете избежать с помощью селектора, - это добавить class = "unselectable".

Tim Down 03.10.2013 20:18

Все правильные варианты CSS:

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

В соответствии с этим Отвечать порядок этих двух настроек webkit может быть критическим, когда -webkit-user-select: должен быть раньше -webkit-touch-callout:. Я не проверял это.

Basil Bourque 15.11.2014 09:23

"If your content is really interesting, then there is little you can ultimately do to protect it"

Это правда, но по моему опыту, большая часть копирования не имеет ничего общего с «в конечном итоге», компьютерными фанатами, решительными плагиаторами или чем-то в этом роде. Обычно это случайное копирование невежественными людьми, и даже простая, легко поддающаяся поражению защита (то есть такая защита, которую легко преодолевают такие люди, как мы), работает достаточно хорошо, чтобы остановить их. Они ничего не знают о «исходном коде просмотра», кэшах или еще чем-нибудь ... черт возьми, они даже не знают, что такое веб-браузер и что они его используют.

Во многих случаях отключение возможности выбора улучшает взаимодействие с пользователем.

Например, позволяя пользователю копировать блок текста на странице без копирования текста каких-либо связанных с ним элементов интерфейса (которые будут вкраплены в копируемый текст).

Вот миксин Sass (scss) для заинтересованных. Компас / CSS 3, похоже, не имеет миксина, выбираемого пользователем.

// @usage use within a rule
// ex. img {@include user-select(none);}
// @param assumed valid user-select value
@mixin user-select($value)
{
    & {
        -webkit-touch-callout: $value;
        -webkit-user-select: $value;
        -khtml-user-select: $value;
        -moz-user-select: $value;
        -ms-user-select: $value;
        user-select: $value;
    }
}

Хотя Compass сделает это более надежно, то есть добавит поддержку только для выбранных вами поставщиков.

Другие вопросы по теме