Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как лучше - parent.childNodes или parent.children (https://javascript.ru/forum/misc/35424-kak-luchshe-parent-childnodes-ili-parent-children.html)

dmitry111 10.02.2013 21:47

как лучше - parent.childNodes или parent.children
 
Что лучше использовать:

var childs = parent.childNodes;

for (var i = 0, len = childs.length; i < len; i += 1) {
    if (childs[i].nodeType === 1) {
        console.log(childs[i]);
    }
}


или

var childs = parent.children;

for (var i = 0, len = childs.length; i < len; i += 1) {
    console.log(childs[i]);
}



первое по стандарту, но длинное; второе нестандартное, но вроде как работает везде и без лишних условий

vadim5june 10.02.2013 21:56

Если текстовые ноды не нужны то children
http://learn.javascript.ru/traversing-dom

dmitry111 10.02.2013 22:08

vadim5june,

но и первый и второй вариант не отобразит лишнего!

dmitriymar 10.02.2013 22:25

обход children быстрее childNodes в 1.5-3 раза не в ие 6-7
в ие6 в 24
в ие7 в 124
(Николас Закас)

dmitry111 10.02.2013 22:47

благодарю

megaupload 10.02.2013 23:11

В чем разница между этими свойствами? Оба стандартные?

dmitry111 10.02.2013 23:50

megaupload,

в 6-ом "носороге" сказано что children нестандартный, хотя реализован везде (15.3.2)

dmitry111 11.02.2013 00:00

Подскажите есть ли какой-нибудь более изящный способ вытащить два элемента из node-листа по классу и создать из них свойство объекта:


// ищет два элемент по их классу. Из значений этих элементов создается свойство объекта:
var childs = xxx.children,
     obj = {},
     i, len, elem1, elem2;

for (i = 0, len = childs; i < len; i += 1) {
    if (childs[i].className === "class1") {
        elem1 = childs[i].innerHTML;
    }
    
    if (childs[i].className === "class2") {
        elem2 = childs[i].innerHTML;
    }
}

obj[elem1] = elem2;


не нравится запись, а исправить не знаю как(

megaupload 11.02.2013 03:39

Обьясните тогда почему он работает быстрее? За счет чего?

danik.js 11.02.2013 05:20

var childs = xxx.children,
    obj = {},
    i, len, elem1, elem2;

if (elem1 = xxx.querySelector('.class1'))
    elem1 = elem1.innerHTML;

if (elem2 = xxx.querySelector('.class2'))
    elem2 = elem2.innerHTML;
}
 
obj[elem1] = elem2;


Только будет искать классы среди всех подомков, не только детей.

dmitry111 11.02.2013 05:38

Цитата:

Сообщение от megaupload
Обьясните тогда почему он работает быстрее? За счет чего?

у Закаса сказано, что за счет количества элементов (ведь любой пробел или комментарий между элементами в childNodes - это новый узел). Да там разница в скорости всего в 2 раза в среднем


danik.js,
спасибо

danik.js 11.02.2013 05:45

dmitry111, код можно огранизовать ввиде цикла, если элементов больше двух.

dmitry111 11.02.2013 07:05

danik.js,

или использовать elem.querySelectorAll(selector);
Цикл слишком затратен!


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