30.11.2009, 16:02
|
Интересующийся
|
|
Регистрация: 06.11.2009
Сообщений: 17
|
|
Получение текстового содержимого из всех вложенных 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>
|
|
30.11.2009, 16:45
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Функция проверяет, является ли элемент текстовой нодой (TEXT_NODE), и тогда записывает ее значение, или элементом (ELEMENT_NODE), и тогда пробегается по нему в поисках текстовых нод.
Вы скармливаете функции document, тип которого DOCUMENT_NODE (9). И скрипт просто игнорирует этот элемент, и не производит поиск внутри него.
Последний раз редактировалось subzey, 30.11.2009 в 17:01.
Причина: очепятка
|
|
02.12.2009, 00:10
|
Интересующийся
|
|
Регистрация: 06.11.2009
Сообщений: 17
|
|
Ясно. Подсажите, а как я могу скорить ему содержимое таблицы table (как я понял это он ELEMENT_NODE(1)), я думал изменить поле вызова функции
<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagName('table')))">
, чтобы элемент HTML по тэгу table, но неработает.
|
|
02.12.2009, 00:17
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
getElementsByTagName возвращает список нод(наверено NODE_LIST), а не один элемент
надо указать конкретный элемент, с помощью индекса, например:
<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagName('table')[0]))">
|
|
02.12.2009, 06:47
|
Интересующийся
|
|
Регистрация: 06.11.2009
Сообщений: 17
|
|
Цитата:
|
getElementsByTagName возвращает список нод(наверено NODE_LIST), а не один элемент
надо указать конкретный элемент, с помощью индекса, например:
<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagNa me('table')[0]))">
|
Спасибо Gvozd за ответ, все верно
|
|
02.12.2009, 13:29
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Кстати, у элементов есть свойство innerText. Возвращает строку, состоящую из всех текстнод внутри элемента.
Хотя, я так понял, этот код для образовательных целей.
|
|
02.12.2009, 20:24
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
subzey,
и пишем на сайте "это сайт недоступен для просмотра под браузером Mozilla"?
|
|
02.12.2009, 22:42
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Gvozd,
...или .textContent для Мозилки.
|
|
02.12.2009, 23:38
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Ага!
кросбразуерность этих двух свойств гарантируешь?
в итоге приходим к http://htmlcoder.visions.ru/JavaScript/?31 или чему-нибудь подобному, ИМХО
потому что я лично не в состоянии гарантировать кросбраузерность этих свойст не могу, так как далеко не все из известных мне браузеров, я могу проверить, или найти документацию, не говоря уже о версиях, и/или неизвестных мне браузерах
|
|
|
|