Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Селектор первого потомка (https://javascript.ru/forum/misc/24296-selektor-pervogo-potomka.html)

FINoM 25.12.2011 07:52

Селектор первого потомка
 
Нужно через 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');
Но это мне кажется говнокодом. Есть идеи?

Kolyaj 25.12.2011 10:42

node.childNodes

Pavel M. 25.12.2011 15:59

а библиотеками не хотите пользоваться?
в jquery будет $(node).children('div') или $(node).find('>div')
а после node.childNodes надо будет еще в цикле выбирать нужные элементы

trikadin 25.12.2011 16:16

Цитата:

Сообщение от Pavel M.
а после node.childNodes надо будет еще в цикле выбирать нужные элементы

node.children

Nekromancer 25.12.2011 16:47

Pavel M.,
Вы странный, зачем ради этого подключать библиотеку которая для поиска одной ноды, выполнит 35 тысяч функций?

Pavel M. 25.12.2011 18:37

я предложил единственный пока в этой теме кроссбраузерный вариант решения проблемы,
не утверждая что он единственный и самый лучший
да, видимо, я странный :)

Nekromancer 25.12.2011 18:53

Pavel M.,
childNode тоже кроссбраузерный. А если человек использует querySelector, то ему явно пофиг на старые браузеры, так что подойдёт и children.

Pavel M. 25.12.2011 19:36

да, я думаю FINoM сам разберется, что лучше использовать

FINoM 25.12.2011 20:06

Да фигово. Хотелось сделать это сверхбыстро (селекторами) и без циклов.

Nekromancer 25.12.2011 20:12

FINoM,
Никто не говорил, что селекторами быстро. Во первых удобно не значит быстро, вы вторых мало писать, не значит быстро. Эт вы в jQuery понабрались.

FINoM 25.12.2011 20:16

Цитата:

Сообщение от Nekromancer
Никто не говорил, что селекторами быстро.

Встроенные функции, как правило, быстрее циклов.
Цитата:

Сообщение от Nekromancer
Эт вы в jQuery понабрались.

А причем здесь jQuery?

Nekromancer 25.12.2011 20:28

Цитата:

Сообщение от FINoM
Встроенные функции, как правило, быстрее циклов.

Неужели, а цикл типо не встроенный? Цикл например быстрее forEach. Я конечно понимаю о чём вы говорите, но правильно то нужно выражаться. Да и что за привычка приводить всё к одному, вы представляете как работает та функцию, о которой вы говорите?

Цитата:

Сообщение от FINoM
А причем здесь jQuery?

Девиз jQuery - "пиши меньше - делай больше". Туда же попадает и удобнее. Но все забывают написать о том, что работай медленнее.

FINoM 25.12.2011 20:32

Цитата:

Сообщение от Nekromancer
Да и что за привычка приводить всё к одному, вы представляете как работает та функцию, о которой вы говорите?

Я так понимаю, что она работает так же, как и селектор в css, а как работают селекторы в css, имею представление.
Цитата:

Сообщение от Nekromancer
Девиз jQuery - "пиши меньше - делай больше". Туда же попадает и удобнее. Но все забывают написать о том, что работай медленнее.

Это — не сиззл, это — встроенная функция. Она точно была бы быстрее (при наличии селектора первого потомка), чем цикл + проверка каждого элемента на соответствие селектору.

Nekromancer 25.12.2011 20:38

Цитата:

Сообщение от FINoM
Я так понимаю, что она работает так же, как и селектор в css, а как работают селекторы в css, имею представление.

Ну вот и расскажите, почему оно быстрее тогда.

Цитата:

Сообщение от FINoM
Это — не сиззл, это — встроенная функция. Она точно была бы быстрее (при наличии селектора первого потомка), чем цикл + проверка каждого элемента на соответствие селектору.

Ну сделайте бенчмарк, посмотрим :) Хотя через тот способ, что вы предложили в начале, через id. И кстати, как jQuery не причём, если вы пытаетесь воспользоваться селектором из jQuery, в селекторах CSS. В css так писать нельзя:
> div {
/* ... */
}

FINoM 25.12.2011 20:41

Цитата:

Сообщение от Nekromancer
Ну сделайте бенчмарк, посмотрим

Ок, попробую.

FINoM 26.12.2011 03:44

Сделал бенчмарк при 20 дивах, каком-то количестве других элементов, 10000 итерациях. Селекторы быстрее в 17 раз. Может быть можно оптимизировать выборку по childNodes, но, уверен, это не придаст существенного увеличения скорости.

Бенчмарк без присваивания результатов выборки:
http://jsfiddle.net/finom/RDV7g/6/
selector: 189ms
childNodes: 3246ms

Бенчмарк с присваиванием:
http://jsfiddle.net/finom/LBU4W/1/
selector: 188ms
childNodes: 3170ms

FINoM 26.12.2011 03:46

Цитата:

Сообщение от Nekromancer
В css так писать нельзя

Я знаю, но думал может в querySelector добавили что-то типа @this.

FINoM 26.12.2011 03:47

Ах да, для запуска нужен хром и консоль.

FINoM 26.12.2011 03:57

А вот тест с поиском по атрибуту:
<div data-id="main1234567">...</div>

div.querySelectorAll('[data-id="main1234567"] > div');

http://jsfiddle.net/finom/LBU4W/2/
Результат тот же.

Nekromancer 26.12.2011 04:09

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

Давайте не усложнять код :)

FINoM 26.12.2011 04:12

Nekromancer, а причем здесь nodeName? Селектором может быть не только 'div', но и 'div.blabla1.blabla2[title="blabla"]'

Nekromancer 26.12.2011 04:18

Ну и чё?
http://jsfiddle.net/RDV7g/9/
childNodes: 314ms
selector: 513ms

Nekromancer 26.12.2011 04:20

Чем больше вы вставляете в querySelector или matchesSelector, тем они медленнее работают.

FINoM 26.12.2011 04:20

Я еще раз повторяю, тестируется соответствие селектору, а не набору свойств узла.

Nekromancer 26.12.2011 04:22

FINoM,
А вам никто и не говорил, про всякие matchSelector и всё такое. В вашем бенчмарке фактически 2 против одного, это не правильно.
Я себе спокойной через children выбрал те же ноды что и вы. Так чем это не та же выборка? Можете называть и по селектору и как хотите.

FINoM 26.12.2011 04:26

Меня всегда радовали ответы, типа: зачем юзать X, если можно юзать Y, при том, что я достаточно четко поставил вопрос. Есть задача, вот и использую.

Nekromancer 26.12.2011 04:29

Цитата:

Сообщение от FINoM
Встроенные функции, как правило, быстрее циклов.

Цитата:

Сообщение от FINoM
чем цикл + проверка каждого элемента на соответствие селектору.

Когда вы докажите, что я не проверил каждого прямого потомка на соответствие селектору, я признаю что я не прав.

Nekromancer 26.12.2011 04:31

Цитата:

Сообщение от FINoM
Меня всегда радовали ответы, типа: зачем юзать X, если можно юзать Y, при том, что я достаточно четко поставил вопрос. Есть задача, вот и использую.

На ваш чётко поставленный вопрос, давно ответили - нет, нельзя так сделать, ибо функция выбирает по селекторам css.

А вот сравнение, что быстрее, это спор. Он к вашему первому посту имеет только косвенное отношение.

FINoM 26.12.2011 04:33

Ок.
t.nodeType == 3 && t.nodeName == 'DIV' && t.className == 'vasea' && t.getAttribute('aaaa') == 'tttt'
Где тут селектор?

Nekromancer 26.12.2011 04:38

div.vasea[aaaa=tttt]

Мне же для бенчмарка не писать регулярку, которая распарсит селектор.
http://jsfiddle.net/RDV7g/10/
Вот представьте, что я с начала распарсил селектор вон в те переменные.
childNodes: 311ms
selector: 499ms

Ваша очередь доказывать.

FINoM 26.12.2011 04:42

Цитата:

Сообщение от Nekromancer
Мне же для бенчмарка не писать регулярку, которая распарсит селектор.

Напиши, там глянем.

Nekromancer 26.12.2011 04:47

FINoM,
Ща, потрачу пору дней и напишу, ага.

FINoM 26.12.2011 04:50

Nekromancer, не пиши.

trikadin 26.12.2011 04:57

Поругались)

FINoM 26.12.2011 04:58

Цитата:

Сообщение от trikadin
Поругались)

Просто Nekromancer слишком толст.

Nekromancer 26.12.2011 05:04

FINoM,
Вы странный какой то, нафига в спор было влезать если вы ничего доказать не можете, предложить и только односложными словами отвечаете? Вот тест с регуляркой из соседней темы, нифига не поменялось.
http://jsfiddle.net/RDV7g/13/
childNodes: 352ms
selector: 546ms

Nekromancer 26.12.2011 05:05

FINoM,
Наверно я отстал от жизни, но что значит ваше оскорбление?

trikadin 26.12.2011 05:08

Цитата:

Сообщение от Nekromancer
Наверно я отстал от жизни, но что значит ваше оскорбление?

Худеть пора! :D

А вообще - вот: Толсто

Nekromancer 26.12.2011 05:11

trikadin,
о, прикинь, докатились ) Забань меня что ле )

FINoM 26.12.2011 05:13

Цитата:

Сообщение от Nekromancer
Вот тест с регуляркой из соседней темы, нифига не поменялось.

Ок. А если два, три класса? Если ищу соответствие атрибуту, но не по равенству ([attr$="some"]). Если ищу по :nth-child(2-2n)? А если... А если подумать? Это, конечно, в случае, если не лулзы здесь собираешь.


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