Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Исключение добавления ссылки, если выделен текст в теге <pre> (https://javascript.ru/forum/css-html/84819-isklyuchenie-dobavleniya-ssylki-esli-vydelen-tekst-v-tege-pre.html)

12345678 05.01.2023 00:35

Исключение добавления ссылки, если выделен текст в теге <pre>
 
Доброго времени суток, уважаемые специалисты.

Имеется такой замечательный скрипт:

document.addEventListener('copy', (event) => {
  const container = document.querySelector('#content');
  const selection = document.getSelection();
  const text = selection.toString();
  
  if(
    text.length >= 50 && (
      container.contains(selection.anchorNode) ||
      container.contains(selection.focusNode) 
    )  
  ) {
    event.clipboardData.setData('text/plain', `${text}\nИсточник: ${document.location.href}`);
    event.preventDefault();
  }
});


Подскажите, пожалуйста, как можно в него добавить исключение на срабатывание, если выделен текст (или если даже часть выделенного текста находится в теге (а часть вне тега)), который находится в тегах <pre>... </pre>

Тег может быть без класса, а может быть и с классом <pre class="nekoe_imya">... </pre>

рони 05.01.2023 01:54

12345678,
строка 5
let el = selection.getRangeAt(0).cloneContents();
  if(el.querySelector('pre')) return;

12345678 05.01.2023 10:08

рони, спасибо, что откликнулись. Я добавил строчки, если текст захватывается, который в pre, то не добавляется ссылка, а если же выделяется чисто текст, что находится в pre, то добавляется. А как сделать, чтобы в последнем случае тоже не добавлялась?
<div id="content">
<p>Самая мощная в мире ветряная турбина запущена в опытную эксплуатацию. Установка Vestas V236-15 MW собрана для оценки эксплуатационных характеристик на полигоне в Эстерильд в Западной Ютландии.</p>
<div class="code-wrap" data-tip="Двойной клик для выделения кода">
<pre class="code-clear">Тут текст, при выделении которого не должен срабатывать скрипт вставки ссылки на источник при копировании в буфер обмена.</pre>
</div>
<p>Диаметр ротора установки составляет 236 м при длине лопастей 115,5 м. Вырабатываемая на пике мощность достигает 15 МВт. На основе этой установки разработаны проекты целого ряда морских ветроэлектростанций в Европе и США.</p>
</div>
<script>
var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);

if ( !isIE ) {
document.addEventListener('copy', (event) => {
  const container = document.querySelector('#content');
  const selection = document.getSelection();
  const text = selection.toString();
  
  let el = selection.getRangeAt(0).cloneContents();
  if(el.querySelector('pre')) return;

  if(
    text.length >= 10 && (
      container.contains(selection.anchorNode) ||
      container.contains(selection.focusNode) 
    )  
  ) {
    event.clipboardData.setData('text/plain', `${text}\nИсточник: ${document.location.href}`);
    event.preventDefault();
  }
}); };
</script>

рони 05.01.2023 10:34

12345678,
18 - 19 заменить на
let el = selection.containsNode(document.querySelector('.code-clear'), true);
  if(el) return;

12345678 05.01.2023 12:03

рони, спасибо за ответ.
Выяснилась ещё одна проблемка - если на странице больше одного блока <pre>, то скрипт для последующих всё равно добавляет ссылку.

рони 05.01.2023 13:16

Цитата:

Сообщение от 12345678
если на странице больше одного блока

а подумать никак? если элементов много, наверно, нужно каждый проверить :(
for (let node of document.querySelectorAll('.code-clear'))
    if(selection.containsNode(node, true)) return;

12345678 05.01.2023 14:23

рони
Спасибо большое :dance: Теперь идеально.


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