Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как сделать чтобы text() брал только текст родителя без текста вложенных контейнеров? (https://javascript.ru/forum/jquery/3778-kak-sdelat-chtoby-text-bral-tolko-tekst-roditelya-bez-teksta-vlozhennykh-kontejjnerov.html)

Andrey32 22.05.2009 20:01

Как сделать чтобы text() брал только текст родителя без текста вложенных контейнеров?
 
(Требуется реализовать некое подобие цитирования.)
Есть див. В нем перемежаются дивы и текст. Например так:
<div class="a">
123
<div>абв</div>
456
<div>где</div>
</div>

Метод text берет весь текст включая текст вложенных элементов (как и написано в доках), т.е.:
$('.a').text() вернет 123абв456где

Требуется получить только текст 123456.


Пока надумал такие варианты:
1) [ОТПАДАЕТ сразу] брать вначале общий текст, потом текст всех дочерних элементов, потом replace и заменять. ОТПАДАЕТ сразу по причине того что в дочернем диве может быть например одна буквы и мы лишимся всех букв.
2) [не нравится реализация] копировать innerhtml в невидимый контейнер, потом в этом контейнере удалять дочерние блоки, только потом брать текст. Какое то странное решение
3) забрать аяксом. Плюсы - могу оформить вложенные дивы как надо (там некое подобие цитат из ББкода). Минусы - задержка и нагрузка (которых очень не хотелось бы) и смысла в этом нет, потому что для цитаты достаточно текста родительского поста.

Может кто подскажет, а то уже к концу недели ничего дельного в голову не лезет :(

e1f 22.05.2009 20:15

Как-то так:
var str = '';
$('.a').each(function(){
  var cN = this.childNodes;
  for (var i=0, l=cN&&cN.length||0; i<l; i++) {
    if (cN[i].nodeType == 3 && String(cN[i].nodeValue).split(/\s/).join('')) {
      str += cN[i].nodeValue;
    }
  }
});

x-yuri 22.05.2009 20:17

ну либо искать плагин :)
либо пройтись по childNode'ам пропуская элементы

Andrey32 23.05.2009 01:33

Большое спасибо. Плагин не понадобится ;) пойду читать доки по чистому js полезно мне чувству будет :)), а то с jquery подотупел ))


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