Jump to content
  • 0

Определение ноды по содержимому


still swamp
 Share

Question

На странице есть уникальный текст завернутый многократно в контейнеры. Требуется вернуть ноду контейнера в котором находится текст. Перебор всего дерева не предлагать.

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

На ходу придумал следующее:

1) находим регекспом нужный текст

2) регекспом же оборачиваем его каким-нибудь элементом-маркером (например <span id="markerNode">текст<span>)

3) при помощи getElementById находим ноду-маркер и ее ноду-родителя (parentNode)

4) копируем HTML из потомка в родителя и вставляем его перед элементом-маркером (родитель.insertBefore(document.createTextNode('содержимое элемента-маркера'), элемент-маркер))

5) удаляем элемент-маркер и возвращаем родителя

UPD:

/**
* @param elem (DOMObject) - нода в которой ищем текст
* @param re (String) - регулярное выражение по которому ищем текст
* return (DOMObject) - элемент-родитель для текста
*/

function getTextParentNode(elem, re) {
var str = elem.innerHTML;
str = str.replace(re, '<span id="markerNode">$0</span>');
elem.innrHTML = str;

var marker = elem.getElementById('markerNode');
var parent = marker.parentNode;

parent.insertBefore(document.insertTextNode(marker.innerHTML), marker);
parent.removeChild(marker);

return parent;
}

P.S. Код не проверял, но вроде должен работать.

Link to comment
Share on other sites

  • 0

1. elem не будет метода getElementById. Использую document.

2. Поиск по getElementById не работает. Подозреваю потому что либо DOM не успевает перестроится либо еще по каким нить странностям.

Link to comment
Share on other sites

  • 0
1. elem не будет метода getElementById. Использую document.

2. Поиск по getElementById не работает. Подозреваю потому что либо DOM не успевает перестроится либо еще по каким нить странностям.

1) Значит вешай класс на спан, и ищи потом этот спан по нужному классу.

2) А ты как скрипт подключаешь на страницу?

Link to comment
Share on other sites

  • 0

1. Если можно уточнить: <span class="MyIdentify"....?

2.

<script type="text/javascript">

/*

Визуальный редактор текста HTML

..... и так далее.

Пока что так. Потом естно будет через SRC

Edited by still swamp
Link to comment
Share on other sites

  • 0
elem не будет метода getElementById

Еще как будет :) предлагаю попробовать, вернет ноду как и должен.

Поиск по getElementById не работает.

Все может быть... может попробовать искать элемент через небольшой таймаут?

Чую, что придется, видимо, пробегать по всему дереву нод. Единственное, для ускорения, можно бегать не по всему документу, а по конкретному элементу. Проверять, что у нас текстовая нода и смотреть какой у нее текст:

function getTextParentNode(elem, txt) {
var allNodes = elem.childNodes;

for (var i = 0, l = allNodes.length; i < l; i++) {
if (allNodes[i].nodeType == 3) {
if (allNodes[i].nodeValue == txt) {
return allNodes[i].parentNode;
}
}
}
}

Link to comment
Share on other sites

  • 0

Это как раз та процедура, которая ищет ноду, в которой был установлен маркер курсора каретки. Те после каждого онклика будет вызываться вот такое счастье. Таймаут сам понимаешь, недопустим. Какое то проклятье.

Плюс я еще наступил на нехороший момент, что у некоторых нод, в которых была каретка nodeValue и вовсе нет. Те мне некуда сохранить сам текст, чтобы после подсветки его искать. Опять тупик.

Есть произвольная нода.

Надо в нее прописать что то, что потому отобразится в innerHTML и что потом можно будет найти.

Edited by still swamp
Link to comment
Share on other sites

  • 0
Надо в нее прописать что то, что потому отобразится в innerHTML и что потом можно будет найти.

Фраза не понятная...

nodeValue есть только у текстовых нод (nodeType == 3), у всех остальных есть только innerHTML (если я не ошибаюсь конечно). Если надо вставлять текст в ноду, то лучше всегда юзать innerHTML.

В браузерах вообще многое очень хреново реализовано... так что вот так... все скрипят зубами по этому поводу, делать то все равно нечего...

Вот тут реализована подсветка кода на лету, может у них потырить скрипты?

Там юзают библиотеку codemirror - http://codemirror.net/

UPD: Чет после всего этого я сильно зауважал JavaScript-девелоперов :)

Link to comment
Share on other sites

  • 0
Фраза не понятная...

nodeValue есть только у текстовых нод (nodeType == 3), у всех остальных есть только innerHTML (если я не ошибаюсь конечно). Если надо вставлять текст в ноду, то лучше всегда юзать innerHTML.

В браузерах вообще многое очень хреново реализовано... так что вот так... все скрипят зубами по этому поводу, делать то все равно нечего...

Вот тут реализована подсветка кода на лету, может у них потырить скрипты?

Там юзают библиотеку codemirror - http://codemirror.net/

Тырить у меня ничего не выйдет, так как разбираться с чужим кодом - вообще не вариант. Легче свое написать или кого то найти за рубли, будет хоть с кого спросить что да почему.

Link to comment
Share on other sites

  • 0
Почему бы не взять готовую библиотеку? У этого codemirror есть довольно хороший мануал, гже описывается API, конфигурация и т.п. и т.д.

Возвращаемся к предыдущей теме. Сколько бы вы хотели денег за прикручивание и составление отчета о том как прикручено?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy