Обновил Лису до 1.0.4 - вылез глюк. Оказывается что у <TABLE> firstChild это не узел <TBODY>, а непонятно что.;))). Глянул в структуру ДОМа по Лисе - оказывается, что это #text.
#text - реагирует на пробел, табуляцию и перевод строки. Опера и ИЕ не обратили на это никакого внимания. Если строки таблицы генерятся динамически (РНР), то есть шанс, что вставишь что-нибудь из вышеперечисленного.
И что интересно, за узлы не посчитало перевод строки перед закрывающим тегом </TABLE>.  Проблема решилась вызовом lastChild, но это, ИМХО, не есть верно....

4m@t!c пишет

Обновил Лису до 1.0.4 - вылез глюк. Оказывается что у <TABLE> firstChild это не узел <TBODY>, а непонятно что.;))). Глянул в структуру ДОМа по Лисе - оказывается, что это #text.
#text - реагирует на пробел, табуляцию и перевод строки. Опера и ИЕ не обратили на это никакого внимания. Если строки таблицы генерятся динамически (РНР), то есть шанс, что вставишь что-нибудь из вышеперечисленного.
И что интересно, за узлы не посчитало перевод строки перед закрывающим тегом </TABLE>.  Проблема решилась вызовом lastChild, но это, ИМХО, не есть верно....

А какая стояла задача?

Вообще-то - вставка строки в таблицу.... А причем здесь задача? Есть неприятная особенность, котрую вы сами можете наблюдать, открыв инспектор DOM. Иерархия идет <TABLE>--->#text---><TBODY>---><TR>, а должно <TABLE>---><TBODY>---><TR>.

А как эта особенность зависит от версии FF 1.0.4?
Помниться всегда так было в движке Gecko
Для вставки строк в таблицу используй insertRow
Например:

Выделить код

Код:

row = document.getElementById("idtable").insertRow(0);
cell=row.insertCell(0);
cell.innerHTML="bla-bla-bla";

А о firstChild и lastChild лучше забудь

>А как эта особенность зависит от версии FF 1.0.4?
ХЕЗ, раньше такого не замечал, может насписано было немного не так.

>А о firstChild и lastChild лучше забудь
Почему?

За insertRow() почему-то не подумал сразу..;)) Спасибо, за предложенный вариант.

Но все равно, почему пробелы/табуляцию/перевод строки на границе <TBODY><TR> воспринимает, как узел, а на границе </TR></TBODY> пробельные символ не учитываются?
Разве по нормам DOMа - это правильно?

==> Разработка

4m@t!c пишет

Но все равно, почему пробелы/табуляцию/перевод строки на границе <TBODY><TR> воспринимает, как узел, а на границе </TR></TBODY> пробельные символ не учитываются?
Разве по нормам DOMа - это правильно?

Похоже таковы особенности реализации Gecko и они напрягают не только тебя:
http://www.mozilla.org/docs/dom/technote/whitespace/
http://www.codingforums.com/archive/ind … -7028.html
Пробовал экспериментировать - у меня пробельные символы проявлялись как узлы везде.
Это так называемые whitespace nodes в переводе Инспектора DOM - пробельные узлы.
По правилам DOM они должны быть, но в некоторых реализациях могут подавляться.
http://www.w3.org/DOM/faq.html#emptytext

Решил не заводить новый топик. Подымаю старый.
Проблема с nextSibling/prevouseSibling.
Бегаю по узлам с помощбю описанных выше методов. Так вот мне нужно пройтись по ячейкам строки. Из-за того, что непечатаемые символы становятся узлами, попадаю не туда, куда нужно. Пока что проблему решаю проверкой имени тега. Такое решение похоже на костыль. Есть идеи?

Проверять не имя тега, а тип узла (nodeType).

4m@t!c пишет

Решил не заводить новый топик. Подымаю старый.
Проблема с nextSibling/prevouseSibling.

Да тоже, решал проблему у Лис с табуляцией и пробелом, которые создают узел ака text

Вот, что Вам может быть поможет взглянуть на ваше решение по другому - в случае, когда нужны элементы table
У таблицы есть аррэй rows - строки; и у каждой строки аррэй cells - ячейка

соответственно обращаемся myTable.rows[n].cells[n]
- ну и в циклах удобно разумеется

Lynn, спасибо.

Проверять не имя тега, а тип узла (nodeType).

Тоже вариант, но все равно  - костыль.

mozilla_user пишет

Да тоже, решал проблему у Лис с табуляцией и пробелом, которые создают узел ака text

Вот, что Вам может быть поможет взглянуть на ваше решение по другому - в случае, когда нужны элементы table
У таблицы есть аррэй rows - строки; и у каждой строки аррэй cells - ячейка

соответственно обращаемся myTable.rows[n].cells[n]
- ну и в циклах удобно разумеется

+1.

А как решали проблему, что достучаться к нужной строке в ИЕ можно

Выделить код

Код:

tableObj.rows(id_row)

, а в Лисе

Выделить код

Код:

tableObj.rows[id_row]

. При поптыке обратиться к строке, как методу объекта - Лиса выдает сообщение об ошибке наподобие

Ошибка: совпадающий атрибут
Источник: file:///C:/Documents%20and%20Settings/4matic/Application%20Data/Mozilla/Firefox/Profiles/v1q59t2f.default/localstore.rdf
Строка 200, символ 20
Исходный код:
                   NS1:LastPingDate="1144762963" />-------------------^

При попытке обратиться в ИЕ с помощью кода

Выделить код

Код:

tableObj.rows[id_row]

я получаю сообщение об ошибке, если идентификатор нечисло, если число, то все отлично отрабатывает.

Как вы решили эту проблему? Передавали номер строки?

Протормозил. Решил так. Перадл идентификатор строки. А затем уже воспользовался cells:

Выделить код

Код:

tr = document.getElementById(idObj);
alert(tr.cells[1].innerText);//В Лисе не отработал, но отработал в ИЕ, Опера.
alert(tr.cells[1].innerHTML);//Везде отработал, но нужен текст, а не HTML-код.
alert(tr.cells[1].firstChild.nodeValue);//В Лисе не отработал, но отработал в ИЕ, Опера.
4m@t!c пишет

В Лисе не отработал, но отработал в ИЕ, Опера.

У меня сейчас три Геко старая Мозила, Лис и Нетскэйп
везде работает :/

Поэтому давайте сверим часы (а вдруг? )у вас что-то не так ;)

На этой странице вводим в локэйшн с javascript:

Выделить код

Код:

alert(document.getElementsByTagName("table")[0].rows[0].cells[0].innerHTML)

получаем в алерте элемент филдсет с иннером (?)

получаем в алерте элемент филдсет с иннером (?)

Филдсет - это то, что лежит внутри <TD></TD> верхней левой ячейки первой таблицы? Если да, то ДА.

ОК - значит всё работает :)

Мне не нужен innerHTML, потому что в нем присутствуют HTML-теги - мне нужен чистый текст, что бы выдать его юзеру.

4m@t!c пишет

Навсякий случай уточню:
rows и cells - это нумер arrays - то есть к содержащимся элементам обращаемся не через метод (), а через индекс cells[0]

Чисто для примера

Выделить код

Код:

for (var i=0,row; i<myTable.rows.length; i++) {

	row = myTable.rows[i];

	for (var n=0,cel; i<row.cells.length; n++) {
		cel = myTable.cells[n];
		
		try { /* делаем что-то полезное с cel */ } catch(e) { /* перехватываем что-то c cel */ }
	}
}

Моделируем ситуацию:
1. Вы не знаете номер строки, но вы знаете его буквенный идентификатор.
2. Вам нужно получить ТЕКСТ в некоторых ячейках, текст должен быть без тегов HTML.

Hint: В ИЕ вы не можете обратиться к ассоциативному хешу, а можете обратиться к числовому. Т.е. в ИЕ конструкция myTable.rows["text_id"] выдаст сообщение об ошибке. Поэтому обратиться к нужной строке можно с помощью метода getElementById, и потому жуе обращаться к хешу ячеек в полученной строке.

P.S. Не понял вообще, как работает ваш скрипт. По-моему он не работает.:P

4m@t!c пишет

Моделируем ситуацию:
1. Вы не знаете номер строки, но вы знаете его буквенный идентификатор.
2. Вам нужно получить ТЕКСТ в некоторых ячейках, текст должен быть без тегов HTML.

Hint: В ИЕ вы не можете обратиться к ассоциативному хешу, а можете обратиться к числовому. Т.е. в ИЕ конструкция myTable.rows["text_id"] выдаст сообщение об ошибке. Поэтому обратиться к нужной строке можно с помощью метода getElementById, и потому жуе обращаться к хешу ячеек в полученной строке.

P.S. Не понял вообще, как работает ваш скрипт. По-моему он не работает.:P

4m@t!c пишет

Мне не нужен innerHTML, потому что в нем присутствуют HTML-теги - мне нужен чистый текст, что бы выдать его юзеру.

innerHTML - эт только для примера - главное мы получили объект. А доступ к остальным полям объекта это как Вы сами понимаете "дело техники"
Развивая тот же пример () захватываем текст у ячейки по параметру Id

function catchText (cell_id)
{
    var text = "";
    for (var i=0,row; i<myTable.rows.length; i++) {
   
        row = myTable.rows[i];
   
        for (var n=0,cel; i<row.cells.length; n++) {
            cel = myTable.cells[n];
            if (cel.id != cell_id) continue;
            /* для Мозиллы получаем весь текст без тегов - даже если они там есть */
            text += " " + cel.textContent;
            /* если код для IE и Мозиллы */
            //text += " " + (cel.textContent || cel.innerText);
        }
    }
    return text;
}

уж конечно всё это в упращённом виде: пример вам надо модифицировать в соответствиии с потребностями ;)
всё получиться! Удачи! А я ушёл в пруд :D

4m@t!c пишет

По-моему он не работает.:P

Да я описался (cut & copy )
во вложенном цикле (паст энд копи)
for (var n=0,cel; i<row.cells.length; n++) {
            cel = myTable.cells[n];

я не праверил но мысль то ясна :D


ниже работающий пример

Выделить код

Код:

<html>
	<head>
		<title>Mozilla &gt; test</title>
	</head>
	<body>
		<table cellspacing="0" cellpadding="0" id="myAllTexts">
		<tr>
			<td id="gt0">
			In Mozilla and in IE
			</td>
		<tr>
		<tr>
			<td id="et">
			(
			</td>
		<tr>
		<tr>
			<td id="et">
			don't
			</td>
		<tr>
		<tr>
			<td id="et">
			)
			</td>
		<tr>
		<tr>
			<td id="gt1">
			work
			</td>
		<tr>
		<tr>
			<td id="gt2">
			that
			</td>
		<tr>
		</table>
		<script type="text/javascript">
		<!--
		
function catchText(myTable, cell_id)
{
    var text = "";
    for (var i=0,row; i<myTable.rows.length; i++) {
   
        row = myTable.rows[i];
   
        for (var n=0,cel; n<row.cells.length; n++) {
            cel = row.cells[n];
            if (!cel.id.match(cell_id)) continue;
            
            /* если код для IE и Мозиллы */
           text += " " + (cel.textContent || cel.innerText);
        }
    }
    return text;
}

alert(catchText(document.getElementById("myAllTexts"), "gt"))
		
		//-->
		</script>
	</body>
</html>

А если вот так:

Выделить код

Код:

allDivs = document.getElementsByTagName('div');
for (var i = 0; i < allDivs.length; i++) {
  thisDiv = allDivs[i];
    if(thisDiv.<что-то> <сравнение> <условие>) {
      <действие>
  }
}

?

Господа, извините за оффтоп, но вот такая особеность Лисы - это просто ужас для работы с DOMами. В конечном итоге скрипт вырос в два раза, потому что нужно проверять nodeType и брать следующий элемент после узла с типом 3.
Спасибо всем учасникам топика.
Разработчикам Лисы - просьба избавиться от этой особености Лисы.