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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Абсолютно расположите блоки div над текстовой областью с z-индексом выше и сделайте эти блоки прозрачным фоновым изображением Гифка.
Обратите внимание, после немного дополнительных размышлений - вам нужно будет связать эти «обложки», чтобы щелкнув по ним, вы переместились бы туда, где должна была находиться вкладка, что означает, что вы можете / должны сделать это с элементом привязки, установленным на display:box, ширина и высота, а также прозрачное фоновое изображение.
Это то, что делает flickr
Такой взлом ужасен. Лично я бы этого избегал.
Крошечная проблема с этим методом - это ссылки, как вы упомянули, и любые другие взаимодействия, которые вы хотите иметь с главным окном ...
Также можно выбирать изображения.
Есть ограничения на использование JavaScript для отмены выделения текста, поскольку это может произойти даже в тех местах, где вы хотите выделить. Чтобы обеспечить богатую и успешную карьеру, избегайте всех требований, которые требуют способности влиять на браузер или управлять им сверх обычного ... если, конечно, вам не платят очень хорошо.
Для Firefox вы можете применить объявление CSS «-moz-user-select» к «none». Ознакомьтесь с их документацией, выбор пользователя.
Это «предварительный просмотр» будущего «пользовательского выбора», как они говорят, так что, возможно, браузеры на основе Опера или WebKit будут поддерживать это. Еще помню, что нашел кое-что для Internet Explorer, но не помню, что именно :).
В любом случае, если это не конкретная ситуация, когда выделение текста приводит к сбою некоторых динамических функций, вам не следует действительно переопределять то, что пользователи ожидают от веб-страницы, а именно возможность выбрать любой текст, который они хотят.
Аналогично в Safari / Chrome / и т. д. -khtml-user-select: нет;
Но есть ли это в стандартах CSS?
<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 или невозможность выбора элементов по-прежнему не поддерживается?
Почему в последнем случае вы меняете стиль курсора на «по умолчанию»? В противном случае +1
Фактически, вы меняете его во всех случаях (отступ вводит в заблуждение)
Попробуй это:
<div onselectstart = "return false">some stuff</div>
Просто, но эффективно ... работает в текущих версиях всех основных браузеров.
У меня это не работает в firefox.
Это только атрибут IE. что делает его избыточным.
Отлично работал для нашего приложения (мы нацелены только на пользователей IE).
Это был единственный способ получить эффект, необходимый для выделения текста в IE11, при выделении с нажатой клавишей Shift в ag-Grid.
Если это выглядит плохо, вы можете использовать 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 до того, как у него появится контент, поэтому вы не можете установить его стиль, прежде чем что-то напишете в документе.
Любой метод 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] {...}, тогда вы не добавляете дополнительный класс
Согласно dev.l-c-n.com/CSS3-selectors/browser-support.php, этот селектор должен поддерживаться в IE8 и выше и, возможно, IE7.
@JoeCoder: Да, я считаю, что селекторы атрибутов работают в IE 7, но не в IE 6.
Просто любопытно, есть ли преимущество в использовании * .unselectable перед .unselectable в таблице стилей?
@BrianMortenson: Никаких: они эквивалентны. У меня есть очень старая привычка включать * в такой селектор, чтобы явно напомнить себе, что я сопоставляю все имена тегов. Однако я больше не нахожу это полезным, и теперь это просто привычка, так что я практически перестал этим заниматься.
Забавно, что @TimDown собрал еще 113 репутации, скопировав свой ответ из дубликата этого вопроса. подождите! <клик> 114;)
@ericsoco: Ага. Это интересный вопрос: если другие публиковали ответы, за которые люди голосуют, и я думаю, что у меня есть лучший ответ, следует ли мне его опубликовать? В конце концов, система по-прежнему позволяет людям находить, просматривать и голосовать за ответы на закрытые вопросы. Я не могу отрицать, что желание иметь репутацию иногда побуждало меня добавлять ответ на повторяющийся вопрос по теме домашнего животного, а не голосовать за его закрытие.
Конечно, вы должны и, конечно же, должны публиковать свои ответы везде, где их можно найти. В конечном счете, суть ответа не в репутации, а в том, чтобы дать ответы там, где их можно найти. я только за. </OT>
@venimus Я бы предпочел классы селекторам xpath, например [unselectable = on] в CSS. В jquery они хороши, если вы сначала сузитесь до непосредственного контейнера, но в CSS селекторы анализируются справа налево, так что это все еще общая проверка каждого элемента и каждого атрибута unselectable элемента с использованием механизма xpath-meh xpath. Точно так же, я полагаю, с API querySelector, который, как я предполагаю, обычно напрямую подключается к механизмам выбора CSS / xpath. Это может измениться со временем, когда браузеры найдут настройки производительности, но я определенно буду иметь это в виду при поддержке IE <= 8, возможно, <= 9.
Возможно, вы правы, но я считаю, что ранняя оптимизация - зло. Также вам не понадобится JS, если вы используете [unselectable = on] * {...}
@venimus: вы не можете избежать JS, если хотите поддерживать IE <= 9 и не хотите помещать unselectable = "on" в каждый элемент. Все, что вы можете избежать с помощью селектора, - это добавить class = "unselectable".
Все правильные варианты 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:. Я не проверял это.
"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 сделает это более надежно, то есть добавит поддержку только для выбранных вами поставщиков.
В зависимости от ваших потребностей, stackoverflow.com/q/4117466/298479 также может быть подходящим решением для вас.