Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Частичное возвращение события после preventDefault (https://javascript.ru/forum/events/41336-chastichnoe-vozvrashhenie-sobytiya-posle-preventdefault.html)

Grubergen 09.09.2013 10:16

Частичное возвращение события после preventDefault
 
Привет всем!!

Столкнулся с необходимостью отменить выделение текста у всего документа. Сделал это так:
document.body.addEventListener('mousedown', function(e){ e.preventDefault(); });

Всё отлично отрабатывает, но нужно вернуть выделение для определённого DIV'a.

Могу ли я как-то это сделать в таких условиях??

ksa 09.09.2013 10:27

Цитата:

Сообщение от Grubergen
нужно вернуть выделение для определённого DIV'a

Вот статейка...
http://javascript.ru/tutorial/events...-sobytie-event

Grubergen 09.09.2013 12:06

Дак я читал, только там про то как и когда события происходят, про возвращение к стандартному поведению браузера не нашёл ни слова...
Хотелось бы лицезреть магию на подобие:
document.body.addEventListener('mousedown', function(e){ e.preventDefault(); });
document.getElementById('div_id').addEventListener('mousedown', function(e){ e.returnMeDefault(); });


Или может есть другой способ отмены выделения текста, отличный от preventDefault, в котором его можно вернуть для элемента??

danik.js 09.09.2013 13:06

http://javascript.ru/tutorial/events...ovka-vsplytiya

Есть еще css3-свойство user-select.

ksa 09.09.2013 13:21

Цитата:

Сообщение от Grubergen (Сообщение 271528)
Дак я читал ...
Хотелось бы лицезреть магию на подобие:
document.body.addEventListener('mousedown', function(e){ e.preventDefault(); });
document.getElementById('div_id').addEventListener('mousedown', function(e){ e.returnMeDefault(); });

Знать неправильно читал... :D
Магия в том, что нужно в обработчике проверять на каком элементе такое сделано... И если элемент нужный не запрещать копирование.

Если же обработчиков несколько - останавливать всплытие на нужном элементе.
http://javascript.ru/tutorial/events...vaniya-sobytiy

Grubergen 09.09.2013 13:32

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

На ум приходит натянуть прозрачный блок поверх всего кроме div-a, натягиваю, под ним всё выделяется, в нём всё выделяется (у него прописал preventDefault, а с body убрал)... В общем либо ничего либо всё...

Grubergen 09.09.2013 13:55

Цитата:

Сообщение от danik.js
Есть еще css3-свойство user-select.

Было бы великолепно, но это кушает только webkit...

Grubergen 09.09.2013 14:18

Нет, Мозилла скушала. Спасибо за помощь!! :)

ksa 09.09.2013 14:58

Grubergen, там нужно "комбинировано" писать

<!DOCTYPE html>
<html>
 <head>
  <title>user-select</title>
  <style type="text/css">
   body { 
      -webkit-user-select: none; 
      -moz-user-select: none;
      user-select: none;
   }
   .enable { 
      -webkit-user-select: text; 
      -moz-user-select: text;
      user-select: text;
   }
  </style>
 </head>
 <body>
  <p>Этот текст нельзя выделить</p>
  <p><input type="text" value="Этот текст можно выделить" /></p>
  <p class="enable">Этот <b>текст</b> тоже можно выделить</p>
 </body>
</html>

Но моя Опера выделяет все...

danik.js 09.09.2013 15:25

Для IE можно проставлять атрибут unselectable="on", но он не наследуется.
Для Оперы вообще ничего не работает, кроме preventDefault() либо getSelection().removeAllRanges() по первому mousemove.


Часовой пояс GMT +3, время: 17:42.