Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Что-то я запутался со свойством children и методом children() в DOM (https://javascript.ru/forum/events/63135-chto-ya-zaputalsya-so-svojjstvom-children-i-metodom-children-v-dom.html)

xintrea 19.05.2016 23:25

Что-то я запутался со свойством children и методом children() в DOM
 
Народ, пару лет назад написал скрипт, в котором использовалась такая конструкция:

var recordCount=currentElement.children("recordtable").children("record").length;

она работала во всех браузерах, от Firefox и Konqueror до IE8.

Я уже забыл что такое яваскрипт. А сейчас смотрю - скрипт не работает. Стал дебажиться, а проблема вот в этой строчке. Сколько бы не было элементов record, всегда получаем 1.

Полез на W3C, смотрю: в DOM-модели есть только children как свойство, а children() как метода нет:

http://www.w3schools.com/jsref/dom_obj_all.asp

Я то ли отстал от жизни, то ли уже новые движки по-другому работают. Я уже и не помню, почему использовал имя элемента в качестве параметра children(), и оно работало. Факт в том, что теперь не работает.

Вопроc: как по-быстрому исправить?

Rise 20.05.2016 00:16

xintrea, это jquery метод, а не DOM-модели.

xintrea 20.05.2016 01:13

Вложений: 1
Цитата:

Сообщение от Rise (Сообщение 417063)
xintrea, это jquery метод, а не DOM-модели.

Я это понял уже...

Проблема оказалась в другом. Сразу после парсинга XML через parseFromString(), элементы одного уровня становятся вложенными. И поэтому у каждого элемента только один дочерний элемент. Это не поддается никакой логике.

Например, XML-код такой:

Код:

<root>
 <format version="1" subversion="1"/>
 <content>
  <node id="1372502371bty1nking9" name="Компьютеры">
  <node id="1372921359br7f0f5w5r" name="Железо">
    <recordtable>
    <record tags="ATX, корпус.." id="1372924870fja1yb6mmw"/>
    <record tags="POST-коды..." id="137294581524gn1ywu1h"/>
    </recordtable>
  </node>
 ...

А вот как выглядит объектное дерево:



У меня все это дело висит в онлайне, можно убедиться:

1. Открываешь URL http://webhamster.ru/webmytetra

2. В появившемся окне вставляешь: https://raw.githubusercontent.com/xi...er/mytetra.xml. Можешь открыть этот URL в браузере чтобы видеть с какими данными идет работа.

3. Открываешь дебагер, ставишь брекпоинт в файле tree.js на строку 197 (это сабжевая проблемная строка)

4. Пару раз после остановки нажимаешь продолжение, пока переменная nodeName не станет «Железо». Именно тогда будет два элемента record, а конструкция вернет в recordCount единицу.

Rise 20.05.2016 01:32

xintrea, а пробел не обязателен разве перед /> в xml?

xintrea 20.05.2016 09:23

Цитата:

Сообщение от Rise (Сообщение 417071)
xintrea, а пробел не обязателен разве перед /> в xml?

По стандарту не обязателен.

https://www.w3.org/TR/xml/#dt-empty

EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'

В регулярке написано "S?", где S::=(#x20 | #x9 | #xD | #xA)+ - пробельный символ, а ? - это 0 или 1 раз.

Rise 20.05.2016 10:24

xintrea, MIME-тип неправильный:
parser.parseFromString(text, "text/html") // надо "text/xml" или "application/xml"


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