LINUX.ORG.RU

Что-то я запутался со свойством children и методом children() в DOM

 , ,


0

1

Народ, пару лет назад написал скрипт, в котором использовалась такая конструкция:

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: как по-быстрому исправить?

★★★★★

man querySelectorAll

Я вот в упор не помню children именно в качестве метода. Если children() принимал теги в качестве аргумента, то тупо меняешь .children("recordtable").children("record") на .querySelectorAll("recordtable record") и должно работать.

P.S. W3Schools ≠ W3C, аж ни разу. Лезь на Mozilla Developer Network лучше.

border-radius ()
Последнее исправление: border-radius (всего исправлений: 2)
Ответ на: комментарий от Xintrea

Ну, тогда хз. Не юзал жоквери для такой элементарщины. Впрочем, если на вход идёт именно жоквери-объект, то от него всегда можно сделать .get(0) и дальше цеплять нативные DOM-методы.

Кстати, да, если надо эмулировать именно поведение .children, то как селектор надо юзать recordtable > record.

border-radius ()
Последнее исправление: border-radius (всего исправлений: 1)
Ответ на: комментарий от border-radius

Ну как бы хотелось бы попроще. Похоже, что старенький jQuery 1.4.4 тупит в новых браузерах. Ежели щас его обновлю, обязательно какие-нибудь новые глюки вылезут.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А что сложного в получении количества дочерних элементов по селектору нативными средствами?

border-radius ()
Ответ на: комментарий от border-radius

Просто этот список элементов у меня используется дальше по коду (без length). И я не уверен, что список jQuery-объектов это тоже самое что и список DOM-объектов.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Во-первых, ты же его даже не кэшируешь.

Во-вторых, jQuery-коллекцию всегда можно воссоздать из нативного NodeList-а применением того же $. Так что можешь смело юзать.

border-radius ()
Последнее исправление: border-radius (всего исправлений: 1)
Ответ на: комментарий от border-radius

У меня много где идет получение списка нужных элементов таким методом. И он сейчас не работает. Мне необходимо разобраться почему.

Я уже поменял jQuery на 1.12.3, результат все тот же.

Но ведь раньше оно работало!

Xintrea ★★★★★ ()
Ответ на: комментарий от border-radius

Да, у меня все в онлайне, можешь потыкать.

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

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

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

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

Я хотел бы остаться в рамках jQuery, и не съезжать на сырой DOM.

Xintrea ★★★★★ ()
Ответ на: комментарий от border-radius

Блин, походу проблема в другом. Одноуровневые элементы record почему-то вложены друг в друга сразу после парсинга через 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>
 ...

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

http://i.piccy.info/i9/1e0371560e9775925a32a5f1b1f79064/1463691713/63577/8259...

Это что за мазафака такая?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea
 // Преобразование XML-строки в DOM-представление
   if (window.DOMParser)
    {
     var parser=new DOMParser();
     this.domTreeData=parser.parseFromString(text, "text/html");
    }

А должно быть

text/xml

int64 ()
Ответ на: комментарий от Xintrea

Одноуровневые элементы record почему-то вложены друг в друга сразу после парсинга через parseFromString().

Это что за мазафака такая?

Обычно такое бывает после того, как где-то пропущен закрывающий тэг.

border-radius ()
Ответ на: комментарий от border-radius

Нигде он не пропущен.

Проблема была в параметре parseFromString()

http://help.dottoro.com/ljcilrao.php

Раньше работал «text/xml», потом у меня он стал тупить на некоторых браузерах, я поменял его на «text/html» - стало работать в старых браузерах, а в новых - по одному узлу. Теперь поменял на «application/xml», заработало.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А не application/xml ?

Да верно, засыпая опечатался. Ну я имел ввиду, что mimetype исправить надо.

int64 ()

Похоже, что использовали библиотеку, или у вас просто не использовался этот кусок кода.

NG2016 ()

Три месяца назад я написал эту песню, но с ебучим темпом инфляции я заебался ...

gobot ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.