У кликов мÑÑи еÑÑÑ Ð½ÐµÐ¿ÑиÑÑÐ½Ð°Ñ Ð¾ÑобенноÑÑÑ.
Ðвойной клик или нажаÑие Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸ÐµÐ¼ кÑÑÑоÑа как пÑавило иниÑииÑÑÑÑ Ð²Ñделение ÑекÑÑа.
ÐÑли Ð¼Ñ Ñ Ð¾Ñим обÑабаÑÑваÑÑ ÑÑи ÑобÑÑÐ¸Ñ Ñами, Ñо Ñакое вÑделение â некÑаÑиво и неÑдобно. Ð ÑÑой главе Ð¼Ñ ÑаÑÑмоÑÑим оÑновнÑе ÑпоÑобÑ, как делаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½ÐµÐ²ÑделÑемÑм.
ÐÐ»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ ÐºÐ°ÑÑинÑ, ÑÑеди Ð½Ð¸Ñ Ð±ÑдÑÑ Ð¸ Ñакие, коÑоÑÑе пÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ Ð½Ðµ ÑолÑко к ÑобÑÑиÑм мÑÑи.
СпоÑоб 1: оÑмена mousedown/selectstart
ÐÑоблема: бÑаÑÐ·ÐµÑ Ð²ÑделÑÐµÑ ÑекÑÑ Ð¿Ñи движении мÑÑÑÑ Ñ Ð·Ð°Ð¶Ð°Ñой левой кнопкой , а Ñакже пÑи двойном клике на ÑлеменÑ. Ðаже Ñам, где ÑÑо не нÑжно.
ÐÑли ÑделаÑÑ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ клик на Ñаком ÑлеменÑе, Ñо обÑабоÑÑик ÑÑабоÑаеÑ. Ðо побоÑнÑм ÑÑÑекÑом ÑвлÑеÑÑÑ Ð²Ñделение ÑекÑÑа бÑаÑзеÑом.
<span ondblclick="alert('двойной клик!')">ТекÑÑ</span>
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð²ÑделениÑ, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑедоÑвÑаÑиÑÑ Ð´ÐµÐ¹ÑÑвие бÑаÑзеÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑобÑÑÐ¸Ñ selectstart в IE и mousedown в дÑÑгиÑ
бÑаÑзеÑаÑ
.
ÐолнÑй код ÑлеменÑа, коÑоÑÑй обÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ клик без вÑделениÑ:
<div ondblclick="alert('ТеÑÑ')" onselectstart="return false" onmousedown="return false">
Ðвойной клик ÑÑда вÑÐ²ÐµÐ´ÐµÑ "ТеÑÑ", без вÑделениÑ
</div>
ÐÑи ÑÑÑановке на ÑодиÑÐµÐ»Ñ â вÑе его поÑомки ÑÑанÑÑ Ð½ÐµÐ²ÑделÑемÑми:
ÐлеменÑÑ ÑпиÑка не вÑделÑÑÑÑÑ Ð¿Ñи клике:
<ul onmousedown="return false" onselectstart="return false">
<li>Ðинни-ÐÑÑ
</li>
<li>ÐÑлик Ðа</li>
<li>ÐÑдÑÐ°Ñ Ð¡Ð¾Ð²Ð°</li>
<li>ÐÑолик. ÐÑоÑÑо кÑолик.</li>
</ul>
ÐÑмена дейÑÑÐ²Ð¸Ñ Ð±ÑаÑзеÑа пÑи mousedown/selectstart оÑменÑÐµÑ Ð²Ñделение пÑи клике, но не запÑеÑÐ°ÐµÑ ÐµÐ³Ð¾ полноÑÑÑÑ.
ÐÑли полÑзоваÑÐµÐ»Ñ Ð²ÑÑ Ð¶Ðµ Ñ Ð¾ÑÐµÑ Ð²ÑделиÑÑ ÑекÑÑовое ÑодеÑжимое ÑлеменÑа, Ñо он Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÑÑо.
ÐоÑÑаÑоÑно наÑаÑÑ Ð²Ñделение (зажаÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¼ÑÑи) не на Ñамом ÑлеменÑе, а ÑÑдом Ñ Ð½Ð¸Ð¼. ÐÐµÐ´Ñ Ñам оÑÐ¼ÐµÐ½Ñ Ð½Ðµ пÑоизойдÑÑ, вÑделение наÑнÑÑÑÑ, и далÑÑе можно пеÑедвинÑÑÑ Ð¼ÑÑÑ Ñже на ÑлеменÑ.
СпоÑоб 2: ÑнÑÑие вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑÑакÑÑм
ÐмеÑÑо пÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð²ÑделениÑ, можно его ÑнÑÑÑ Ð² обÑабоÑÑике ÑобÑÑиÑ, поÑле Ñого, как оно Ñже пÑоизоÑло.
ÐÐ»Ñ ÑÑого Ð¼Ñ Ð¸ÑполÑзÑем меÑÐ¾Ð´Ñ ÑабоÑÑ Ñ Ð²Ñделением, коÑоÑÑе опиÑÐ°Ð½Ñ Ð² оÑделÑной главе ÐÑделение: Range, TextRange и Selection. ÐдеÑÑ Ð½Ð°Ð¼ понадобиÑÑÑ Ð²Ñего лиÑÑ Ð¾Ð´Ð½Ð° ÑÑнкÑÐ¸Ñ clearSelection, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ ÑнимаÑÑ Ð²Ñделение.
ÐÑÐ¸Ð¼ÐµÑ Ñо ÑнÑÑием вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñи двойном клике на ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка:
<ul>
<li ondblclick="clearSelection()">ÐÑделение оÑменÑеÑÑÑ Ð¿Ñи двойном клике.</li>
</ul>
<script>
function clearSelection() {
if (window.getSelection) {
window.getSelection().removeAllRanges();
} else { // ÑÑаÑÑй IE
document.selection.empty();
}
}
</script>
У ÑÑого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° еÑÑÑ Ð´Ð²Ðµ оÑобенноÑÑи, на коÑоÑÑе ÑÑÐ¾Ð¸Ñ Ð¾Ð±ÑаÑиÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ:
- ÐÑделение вÑÑ Ð¶Ðµ пÑоизводиÑÑÑ, но ÑÑÑ Ð¶Ðµ ÑнимаеÑÑÑ. ÐÑо вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº мигание и не оÑÐµÐ½Ñ ÐºÑаÑиво.
- ÐÑделение пÑи помоÑи пеÑÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¶Ð°Ñой мÑÑи вÑÑ ÐµÑÑ ÑабоÑаеÑ, Ñак ÑÑо поÑеÑиÑÐµÐ»Ñ Ð¸Ð¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑделиÑÑ ÑодеÑжимое ÑлеменÑа.
СпоÑоб 3: ÑвойÑÑво user-select
СÑÑеÑÑвÑÐµÑ Ð½ÐµÑÑандаÑÑное CSS-ÑвойÑÑво user-select, коÑоÑое Ð´ÐµÐ»Ð°ÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½ÐµÐ²ÑделÑемÑм.
Ðно когда-Ñо планиÑовалоÑÑ Ð² ÑÑандаÑÑе CSS3, поÑом Ð¾Ñ Ð½ÐµÐ³Ð¾ оÑказалиÑÑ, но поддеÑжка в бÑаÑзеÑÐ°Ñ Ñже бÑла Ñделана и поÑÐ¾Ð¼Ñ Ð¾ÑÑалаÑÑ.
ÐÑо ÑвойÑÑво ÑабоÑÐ°ÐµÑ (Ñ Ð¿ÑеÑикÑом) везде, кÑоме IE9-:
<style>
b {
-webkit-user-select: none;
/* user-select -- ÑÑо неÑÑандаÑÑное ÑвойÑÑво */
-moz-user-select: none;
/* поÑÑÐ¾Ð¼Ñ Ð½ÑÐ¶Ð½Ñ Ð¿ÑеÑикÑÑ */
-ms-user-select: none;
}
</style>
СÑÑока до..
<div ondblclick="alert('ТеÑÑ')">
<b>ÐÑÐ¾Ñ ÑекÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð²ÑделиÑÑ (кÑоме IE9-)</b>
</div>
.. СÑÑока поÑле
ЧиÑайÑе на ÑÑÑ ÑÐµÐ¼Ñ Ñакже Controlling Selection with CSS user-select.
IE9-: аÑÑибÑÑ unselectable=«on»
Ð IE9- Ð½ÐµÑ user-select, но еÑÑÑ Ð°ÑÑибÑÑ unselectable.
Ðн оÑменÑÐµÑ Ð²Ñделение, но Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð¾ÑобенноÑÑи:
- Ðо-пеÑвÑÑ , невÑделÑемоÑÑÑ Ð½Ðµ наÑледÑеÑÑÑ. То еÑÑÑ, невÑделÑемоÑÑÑ ÑодиÑÐµÐ»Ñ Ð½Ðµ Ð´ÐµÐ»Ð°ÐµÑ Ð½ÐµÐ²ÑделÑемÑми деÑей.
- Ðо-вÑоÑÑÑ
, ÑекÑÑ, в оÑлиÑие оÑ
user-select, вÑÑ Ñавно можно вÑделиÑÑ, еÑли наÑаÑÑ Ð²Ñделение не на Ñамом ÑлеменÑе, а ÑÑдом Ñ Ð½Ð¸Ð¼.
<div ondblclick="alert('ТеÑÑ')" unselectable="on" style="border:1px solid black">
ÐÑÐ¾Ñ ÑекÑÑ Ð½ÐµÐ²ÑделÑем в IE, <em>кÑоме доÑеÑниÑ
ÑлеменÑов</em>
</div>
ÐÐµÐ²Ð°Ñ ÑаÑÑÑ ÑекÑÑа в IE не вÑделÑеÑÑÑ Ð¿Ñи двойном клике. ÐÑавÑÑ ÑаÑÑÑ (em) можно вÑделиÑÑ, Ñ.к. на ней Ð½ÐµÑ Ð°ÑÑибÑÑа unselectable.
РдейÑÑвии:
ÐÑого
ÐÐ»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð½ÐµÑколÑко ÑпоÑобов:
-
CSS-ÑвойÑÑво
user-selectâ везде кÑоме IE9- (нÑжен пÑеÑикÑ, неÑÑандаÑÑ). -
ÐÑÑибÑÑ
unselectable="on"â ÑабоÑÐ°ÐµÑ Ð´Ð»Ñ Ð»ÑбÑÑ IE (должен бÑÑÑ Ñ Ð²ÑÐµÑ Ð¿Ð¾Ñомков) -
ÐÑмена дейÑÑвий на
mousedownиselectstart:elem.onmousedown = elem.onselectstart = function() { return false; }; -
ÐÑмена вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑ-ÑакÑÑм ÑеÑез ÑÑнкÑиÑ
clearSelection(), опиÑаннÑÑ Ð²ÑÑе.
Ðакой же ÑпоÑоб вÑбиÑаÑÑ?
ÐÑо завиÑÐ¸Ñ Ð¾Ñ Ð·Ð°Ð´Ð°Ñ Ð¸ ваÑего ÑдобÑÑва, а Ñакже конкÑеÑного ÑлÑÑаÑ. ÐÑе опиÑаннÑе ÑпоÑÐ¾Ð±Ñ ÑабоÑаÑÑ.
ÐедоÑÑаÑок user-select â в Ñом, ÑÑо поÑеÑиÑÐµÐ»Ñ ÑеÑÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑкопиÑоваÑÑ ÑекÑÑ. Ð ÑÑо, еÑли он заÑ
оÑÐµÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑо ÑделаÑÑ?
РлÑбом ÑлÑÑае ÑÑи ÑпоÑÐ¾Ð±Ñ Ð½Ðµ пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð²ÑделениÑ-и-копиÑованиÑ.
ÐÑли Ñж Ñ
оÑеÑÑÑ Ð·Ð°Ð¿ÑеÑиÑÑ ÐºÐ¾Ð¿Ð¸Ñование â можно иÑполÑзоваÑÑ ÑобÑÑие oncopy:
<div oncopy="alert('ÐопиÑование запÑеÑено');return false">
УважаемÑй копиÑоваÑелÑ,
поÑемÑ-Ñо авÑÐ¾Ñ Ñ
оÑÐµÑ Ð·Ð°ÑÑавиÑÑ Ð²Ð°Ñ Ð¿Ð¾ÐºÐ¾Ð¿Ð°ÑÑÑÑ Ð² иÑÑ
одном коде ÑÑой ÑÑÑаниÑÑ.
ÐÑли Ð²Ñ Ð·Ð½Ð°ÐµÑе JS или HTML, Ñо ÑкопиÑоваÑÑ ÑекÑÑ Ð½Ðµ ÑоÑÑÐ°Ð²Ð¸Ñ Ð´Ð»Ñ Ð²Ð°Ñ Ð¿ÑоблемÑ,
Ð½Ñ Ð° еÑли неÑ, Ñо ÑвÑ...
</div>
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)