Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.11.2009, 16:02
Интересующийся
Отправить личное сообщение для EmDmAl Посмотреть профиль Найти все сообщения от EmDmAl
 
Регистрация: 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>
Ответить с цитированием
  #2 (permalink)  
Старый 30.11.2009, 16:45
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

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

Последний раз редактировалось subzey, 30.11.2009 в 17:01. Причина: очепятка
Ответить с цитированием
  #3 (permalink)  
Старый 02.12.2009, 00:10
Интересующийся
Отправить личное сообщение для EmDmAl Посмотреть профиль Найти все сообщения от EmDmAl
 
Регистрация: 06.11.2009
Сообщений: 17

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

, чтобы элемент HTML по тэгу table, но неработает.
Ответить с цитированием
  #4 (permalink)  
Старый 02.12.2009, 00:17
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

getElementsByTagName возвращает список нод(наверено NODE_LIST), а не один элемент
надо указать конкретный элемент, с помощью индекса, например:
<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagName('table')[0]))">
Ответить с цитированием
  #5 (permalink)  
Старый 02.12.2009, 06:47
Интересующийся
Отправить личное сообщение для EmDmAl Посмотреть профиль Найти все сообщения от EmDmAl
 
Регистрация: 06.11.2009
Сообщений: 17

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

<input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagNa me('table')[0]))">
Спасибо Gvozd за ответ, все верно
Ответить с цитированием
  #6 (permalink)  
Старый 02.12.2009, 13:29
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Кстати, у элементов есть свойство innerText. Возвращает строку, состоящую из всех текстнод внутри элемента.
Хотя, я так понял, этот код для образовательных целей.
Ответить с цитированием
  #7 (permalink)  
Старый 02.12.2009, 20:24
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

subzey,
и пишем на сайте "это сайт недоступен для просмотра под браузером Mozilla"?
Ответить с цитированием
  #8 (permalink)  
Старый 02.12.2009, 22:42
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Gvozd,
...или .textContent для Мозилки.
Ответить с цитированием
  #9 (permalink)  
Старый 02.12.2009, 23:38
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,245

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(DOM) JQuery получение текста ссылки Mila Общие вопросы Javascript 5 25.04.2012 13:36