Селектор первого потомка
Нужно через querySelectorAll получить потомков первого уровня.
node.querySelectorAll('> div'); // выдаёт синтаксическую ошибку можно только так: node.querySelectorAll('#node1 > div'); //при условии, что node.id==="node1"Как быть, если я не знаю селектора node? Может быть есть возможность его (селектор) получить (встроенными функциями, без переборов)? Вижу вариант вешать какой-то рандомный атрибут, типа: var id = node.dataset.randomId = Math.random(); node.querySelectorAll('[data-randomId="'+id+'"] > div');Но это мне кажется говнокодом. Есть идеи? |
node.childNodes |
а библиотеками не хотите пользоваться?
в jquery будет $(node).children('div') или $(node).find('>div') а после node.childNodes надо будет еще в цикле выбирать нужные элементы |
Цитата:
|
Pavel M.,
Вы странный, зачем ради этого подключать библиотеку которая для поиска одной ноды, выполнит 35 тысяч функций? |
я предложил единственный пока в этой теме кроссбраузерный вариант решения проблемы,
не утверждая что он единственный и самый лучший да, видимо, я странный :) |
Pavel M.,
childNode тоже кроссбраузерный. А если человек использует querySelector, то ему явно пофиг на старые браузеры, так что подойдёт и children. |
да, я думаю FINoM сам разберется, что лучше использовать
|
Да фигово. Хотелось сделать это сверхбыстро (селекторами) и без циклов.
|
FINoM,
Никто не говорил, что селекторами быстро. Во первых удобно не значит быстро, вы вторых мало писать, не значит быстро. Эт вы в jQuery понабрались. |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
> div { /* ... */ } |
Цитата:
|
Сделал бенчмарк при 20 дивах, каком-то количестве других элементов, 10000 итерациях. Селекторы быстрее в 17 раз. Может быть можно оптимизировать выборку по childNodes, но, уверен, это не придаст существенного увеличения скорости.
Бенчмарк без присваивания результатов выборки: http://jsfiddle.net/finom/RDV7g/6/ selector: 189ms childNodes: 3246ms Бенчмарк с присваиванием: http://jsfiddle.net/finom/LBU4W/1/ selector: 188ms childNodes: 3170ms |
Цитата:
|
Ах да, для запуска нужен хром и консоль.
|
А вот тест с поиском по атрибуту:
<div data-id="main1234567">...</div> div.querySelectorAll('[data-id="main1234567"] > div'); http://jsfiddle.net/finom/LBU4W/2/ Результат тот же. |
http://jsfiddle.net/RDV7g/7/
Firefox: selector: 442ms childNodes: 654ms Chrome: selector: 689ms childNodes: 1173ms http://jsfiddle.net/RDV7g/8/ Firefox: childNodes: 302ms selector: 451ms Chrome: childNodes: 373ms selector: 681ms Давайте не усложнять код :) |
Nekromancer, а причем здесь nodeName? Селектором может быть не только 'div', но и 'div.blabla1.blabla2[title="blabla"]'
|
|
Чем больше вы вставляете в querySelector или matchesSelector, тем они медленнее работают.
|
Я еще раз повторяю, тестируется соответствие селектору, а не набору свойств узла.
|
FINoM,
А вам никто и не говорил, про всякие matchSelector и всё такое. В вашем бенчмарке фактически 2 против одного, это не правильно. Я себе спокойной через children выбрал те же ноды что и вы. Так чем это не та же выборка? Можете называть и по селектору и как хотите. |
Меня всегда радовали ответы, типа: зачем юзать X, если можно юзать Y, при том, что я достаточно четко поставил вопрос. Есть задача, вот и использую.
|
Цитата:
Цитата:
|
Цитата:
А вот сравнение, что быстрее, это спор. Он к вашему первому посту имеет только косвенное отношение. |
Ок.
t.nodeType == 3 && t.nodeName == 'DIV' && t.className == 'vasea' && t.getAttribute('aaaa') == 'tttt'Где тут селектор? |
div.vasea[aaaa=tttt] Мне же для бенчмарка не писать регулярку, которая распарсит селектор. http://jsfiddle.net/RDV7g/10/ Вот представьте, что я с начала распарсил селектор вон в те переменные. childNodes: 311ms selector: 499ms Ваша очередь доказывать. |
Цитата:
|
FINoM,
Ща, потрачу пору дней и напишу, ага. |
Nekromancer, не пиши.
|
Поругались)
|
Цитата:
|
FINoM,
Вы странный какой то, нафига в спор было влезать если вы ничего доказать не можете, предложить и только односложными словами отвечаете? Вот тест с регуляркой из соседней темы, нифига не поменялось. http://jsfiddle.net/RDV7g/13/ childNodes: 352ms selector: 546ms |
FINoM,
Наверно я отстал от жизни, но что значит ваше оскорбление? |
Цитата:
А вообще - вот: Толсто |
trikadin,
о, прикинь, докатились ) Забань меня что ле ) |
Цитата:
|
Часовой пояс GMT +3, время: 01:27. |