Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.08.2021, 20:27
Новичок на форуме
Отправить личное сообщение для evgeniy2 Посмотреть профиль Найти все сообщения от evgeniy2
 
Регистрация: 27.04.2017
Сообщений: 6

Как получить выделенный на странице текст и alt рисунков?
Метод document.getSelection().toString() возвращает выделенный на странице текст, но без alt-ов. Как можно сделать, чтобы с текстом захватывались alt-ы рисунков в тексте, как они захватываются при ручном копировании Ctrl+C?
Ответить с цитированием
  #2 (permalink)  
Старый 06.08.2021, 22:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

В фурифоксе оно так и работает. В хроме - никак. Только костылить разве что как-то хитро.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 06.08.2021, 23:43
Кандидат Javascript-наук
Отправить личное сообщение для od0201 Посмотреть профиль Найти все сообщения от od0201
 
Регистрация: 07.05.2020
Сообщений: 108

window.getSelection().getRangeAt(0).startContainer.innerHTML
Ответить с цитированием
  #4 (permalink)  
Старый 06.08.2021, 23:56
Новичок на форуме
Отправить личное сообщение для evgeniy2 Посмотреть профиль Найти все сообщения от evgeniy2
 
Регистрация: 27.04.2017
Сообщений: 6

Сообщение от od0201 Посмотреть сообщение
window.getSelection().getRangeAt(0).startContainer.innerHTML
startContainer - [Object Text], startContainer.innerHTML - undefined.

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

Последний раз редактировалось evgeniy2, 07.08.2021 в 00:07.
Ответить с цитированием
  #5 (permalink)  
Старый 07.08.2021, 10:54
Кандидат Javascript-наук
Отправить личное сообщение для od0201 Посмотреть профиль Найти все сообщения от od0201
 
Регистрация: 07.05.2020
Сообщений: 108

Для данного 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>
Ответить с цитированием
  #6 (permalink)  
Старый 07.08.2021, 12:09
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

Сообщение от od0201
Для данного HTML выше описаный мной скрипт работает
Если выделить не только картинку (например, вместе с текстом над ней), то выдает undefined
Ответить с цитированием
  #7 (permalink)  
Старый 07.08.2021, 18:31
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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

Хотя последнее, кстати, не так просто. Стили-то отвалятся у контента. Если это критично, то придется без cloneContents. А именно, делать обход от startContainer до endContainer, причем следующая нода берется так:
nextNode = node.firstChild || node.nextSibling || node.parentNode.nextSibling || node.parentNode.parentNode.nextSibling || ...
(цикл по парентнодам)
Ответить с цитированием
  #8 (permalink)  
Старый 07.08.2021, 19:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

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

Нет, если костылить, то проще перед tString() пройтись по всем картинкам и прилепить к ним скрытый span с текстом alt(удалив его с картинки для FF), после - вернуть как было.
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 07.08.2021, 19:29
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Aetae,
Менять документ по ходу пьесы - тоже так себе. Вдруг там где-то сидит в засаде мутейшенОбзервер) я, в общем, за readonly в таких задачах
Ответить с цитированием
  #10 (permalink)  
Старый 07.08.2021, 19:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Toggle эффект блока с кнопкой "Читать дальше". С меня "+" subbziro Общие вопросы Javascript 10 28.12.2016 01:43
как получить текст ссілки imedia Элементы интерфейса 3 23.04.2016 12:19
прогкрутка к якорям cOAPerator Общие вопросы Javascript 20 27.08.2013 03:30
DOM vs iframe. Как в ифрейме заменить выделенный текст (его innerHTML)? Бухалыч Events/DOM/Window 4 20.08.2009 14:30
На входе HTML получить на выходе просто текст, как? Dmitry Общие вопросы Javascript 2 25.08.2008 10:42