Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как получить выделенный на странице текст и alt рисунков? (https://javascript.ru/forum/dom-window/82932-kak-poluchit-vydelennyjj-na-stranice-tekst-i-alt-risunkov.html)

evgeniy2 06.08.2021 20:27

Как получить выделенный на странице текст и alt рисунков?
 
Метод document.getSelection().toString() возвращает выделенный на странице текст, но без alt-ов. Как можно сделать, чтобы с текстом захватывались alt-ы рисунков в тексте, как они захватываются при ручном копировании Ctrl+C?

Aetae 06.08.2021 22:22

В фурифоксе оно так и работает. В хроме - никак. Только костылить разве что как-то хитро.

od0201 06.08.2021 23:43

window.getSelection().getRangeAt(0).startContainer.innerHTML

evgeniy2 06.08.2021 23:56

Цитата:

Сообщение от od0201 (Сообщение 539234)
window.getSelection().getRangeAt(0).startContainer.innerHTML

startContainer - [Object Text], startContainer.innerHTML - undefined.

upd.
Так работает:
s = window.getSelection().getRangeAt(0).startContainer.parentNode.innerHTML;
Но выдает текст с тегами.

od0201 07.08.2021 10:54

Для данного HTML выше описаный мной скрипт работает
<body>
  выделите картинку и кликните по ней
  <div>
    <img src="https://akvis.com/img/ico/sketch-200.png" alt="AKVIS Sketch" height=100>
  </div>  
</body>
<script>
  document.querySelector('img').addEventListener('click',(e)=>{
    alert( window.getSelection().getRangeAt(0).startContainer.innerHTML)
  })
</script>

voraa 07.08.2021 12:09

Цитата:

Сообщение от od0201
Для данного HTML выше описаный мной скрипт работает

Если выделить не только картинку (например, вместе с текстом над ней), то выдает undefined

Alexandroppolus 07.08.2021 18:31

Цитата:

Сообщение от Aetae
Только костылить разве что как-то хитро.

Ничего хитрого. Просто взять range.cloneContents(), да и обойти его рекурсивно. С текстовых узлов брать data (или как его там), с картинок - alt, теги br заменить на переносы строк, границы блочных элементов - тоже.

Хотя последнее, кстати, не так просто. Стили-то отвалятся у контента. Если это критично, то придется без cloneContents. А именно, делать обход от startContainer до endContainer, причем следующая нода берется так:
nextNode = node.firstChild || node.nextSibling || node.parentNode.nextSibling || node.parentNode.parentNode.nextSibling || ...
(цикл по парентнодам)

Aetae 07.08.2021 19:21

Alexandroppolus, ага, ничего хитрого. Просто месцок-другой вылавливания багов.)

Нет, если костылить, то проще перед tString() пройтись по всем картинкам и прилепить к ним скрытый span с текстом alt(удалив его с картинки для FF), после - вернуть как было.

Alexandroppolus 07.08.2021 19:29

Aetae,
Менять документ по ходу пьесы - тоже так себе. Вдруг там где-то сидит в засаде мутейшенОбзервер) я, в общем, за readonly в таких задачах

Aetae 07.08.2021 19:40

Само собой, костыль на то и костыль.
Но повторить работу Selection.toString, но с "маленьким" дополнением - это задача куда более эпичная, чем кажется на первый взгляд.
Если уж мне бы такая поступила - меньше месяца яб на неё не закладывал, а начал бы с того, что открыл сырцы браузера в нужной части.)


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