Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Получение текстового содержимого из всех вложенных DOM (https://javascript.ru/forum/events/6496-poluchenie-tekstovogo-soderzhimogo-iz-vsekh-vlozhennykh-dom.html)

EmDmAl 30.11.2009 16:02

Получение текстового содержимого из всех вложенных DOM
 
Здравствуйте. В книге "Подробное руководство" Дэвида Флэнагана описан пример, Получение текстового содержимого из всех вложенных DOM'узлов стр.334. Вся проблема втом что в массив string ничего незаносится, немогу понять почему?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link rel="stylesheet" type="text/css" href="steel.css" />
<head>
<title></title>
</head>
<body>
Это <i>пример</i> документа.
<br><br>
<input value="Вывод текста" type="button" onClick="alert(getText(document))">
<script language="javascript">
function getText(n) {
// Операция объединения строк очень ресурсоемка, потому сначала
// содержимое текстовых узлов помещается в массив, затем выполняется
// операция конкатенации элементов массива в одну строку.
var strings = [];

getStrings(n, strings);
return strings.join("");
// Эта рекурсивная функция отыскивает все текстовые узлы
// и добавляет их содержимое в конец массива.
function getStrings(n, strings) {
if (n.nodeType == 3 /* Node.TEXT_NODE */)
strings.push(n.data);
else if (n.nodeType == 1 /* Node.ELEMENT_NODE */) {
// Обратите внимание, обход выполняется
// с использованием firstChild/nextSibling
for(var m = n.firstChild; m != null; m = m.nextSibling) {
getStrings(m, strings);
}
}
}
}
alert(strings[2]);
</script>
<table>
<tr><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
<tr class='odd'><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
<tr><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
<tr><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
<tr><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
<tr><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
<tr><td>One</td><td>Two</td><td>Three</td><td>Four</td></tr>
</table>
</body>

subzey 30.11.2009 16:45

Функция проверяет, является ли элемент текстовой нодой (TEXT_NODE), и тогда записывает ее значение, или элементом (ELEMENT_NODE), и тогда пробегается по нему в поисках текстовых нод.
Вы скармливаете функции document, тип которого DOCUMENT_NODE (9). И скрипт просто игнорирует этот элемент, и не производит поиск внутри него.

EmDmAl 02.12.2009 00:10

Ясно. Подсажите, а как я могу скорить ему содержимое таблицы table (как я понял это он ELEMENT_NODE(1)), я думал изменить поле вызова функции
<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagName('table')))">

, чтобы элемент HTML по тэгу table, но неработает.

Gvozd 02.12.2009 00:17

getElementsByTagName возвращает список нод(наверено NODE_LIST), а не один элемент
надо указать конкретный элемент, с помощью индекса, например:
<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagName('table')[0]))">

EmDmAl 02.12.2009 06:47

Цитата:

getElementsByTagName возвращает список нод(наверено NODE_LIST), а не один элемент
надо указать конкретный элемент, с помощью индекса, например:

<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagNa me('table')[0]))">
Спасибо Gvozd за ответ, все верно

subzey 02.12.2009 13:29

Кстати, у элементов есть свойство innerText. Возвращает строку, состоящую из всех текстнод внутри элемента.
Хотя, я так понял, этот код для образовательных целей. :)

Gvozd 02.12.2009 20:24

subzey,
и пишем на сайте "это сайт недоступен для просмотра под браузером Mozilla"?

subzey 02.12.2009 22:42

Gvozd,
...или .textContent для Мозилки.

Gvozd 02.12.2009 23:38

Ага!
кросбразуерность этих двух свойств гарантируешь?
в итоге приходим к http://htmlcoder.visions.ru/JavaScript/?31 или чему-нибудь подобному, ИМХО
потому что я лично не в состоянии гарантировать кросбраузерность этих свойст не могу, так как далеко не все из известных мне браузеров, я могу проверить, или найти документацию, не говоря уже о версиях, и/или неизвестных мне браузерах


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