Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   координаты TEXT_NODE (https://javascript.ru/forum/events/53849-koordinaty-text_node.html)

милт 21.02.2015 02:13

координаты TEXT_NODE
 
Мне надо сделать так чтобы функция elementFromPoint выдавала не только тот узел который ELEMENT_NODE, но и TEXT_NODE.
Мне в голову приходила мысль превращать TEXT_NODE в ELEMENT_NODE например с помощью wrap, но эта функция делается с помощью jquery и я не знаю как её применить к одному конкретному, выбранному узлу. или может быть можно как-то определить координаты TEXT_NODE или ещё какой нибудь способ есть?

Aetae 21.02.2015 02:20

Для начала: зачем вообще используется именно elementFromPoint?
С помощью событий мыши например можно получить не только текстноду, но даже позицию в оной.

милт 21.02.2015 14:01

Мне бы как нибудь без установки событий мыши.

Aetae 21.02.2015 15:41

elementFromPoint очевидно получает элемент. Вообще этот метод оправдан в единичных случаях, и я сомневаюсь ваш именно такой. Тем не менее elementFromPoint возвращает самый последний в иерархии элемент, потому соответствующую текстноду получить проблем никаких нет, просто взять firstChild:
var textNode = document.elementFromPoint(x, y).firstChild;

//если первый элемент не текстнода, значит точка где-то далеко от текста, возвращаем null.
if(textNode && textNode.nodeType !== 3) textNode = null;
//тут можно добавить для надёжности функцию, что до определённого предела будет двигать точку вверх-вниз, пока не найдёт таки текст
Какие-то проблемы требующие извращений могут возникнуть если текстноды добавлялись скриптом через createTextNode(), т.е. в одном элементе несколько текстнод подряд. Впрочем тоже решаемо: если все добавленные тексноды можно считать как одну, то поможет применение elem.normalize(), иначе если каждая подобная нода важна(сооовсем уж извращённый вариант) то можно понаркоманить с помощью Range и getClientRects().

милт 21.02.2015 17:44

Цитата:

Сообщение от Aetae (Сообщение 357648)
если каждая подобная нода важна(сооовсем уж извращённый вариант) то можно понаркоманить с помощью Range и getClientRects().

У меня как раз такой извращённый вариант. Range и getClientRects() это сложно. Может быть всё таки можно как-то сделать из текстовой ноды обычную?
Я нашёл как с помощью wrap сделать все текстовые ноды обычными, но не знаю как трансформировать только одну ноду, а не все.
$("*").contents().filter(function(){
     return this.nodeType === 3;
  }).wrap('<teg>');

Aetae 21.02.2015 18:06

Это бред. Да и что значит "только одну"? Если вы эту одну нашли - накой её оборачивать, а если не нашли - как вы собираетесь оборачивать то, что неизвестно?

И да - сложно. А что вы хотели? Удаление гланд через жопу и не может быть лёгкой операцией.

милт 21.02.2015 22:49

Я собираюсь обернуть childNodes которые являются текстовыми нодами выбранного элемента и применить elementFromPoint повторно в ту же точку. Есть способ обернуть элементы по одному?

милт 21.02.2015 23:16

Мне бы сделать чтобы хоть как-то работало, а потом возможно сделаю лучше.

рони 21.02.2015 23:29

Цитата:

Сообщение от милт
Мне бы как нибудь без установки событий мыши

почему?

милт 22.02.2015 02:27

Потому что в моём случае нельзя редактировать html код страницы, можно только добавить Javascript как дополнение


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