12.07.2015 Views

Реактивные веб-сайты Николай Мациевский Евгений ...

Реактивные веб-сайты Николай Мациевский Евгений ...

Реактивные веб-сайты Николай Мациевский Евгений ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Технологии будущего219while (idx—) {sets[idx].yeasss = null;}Именно такой код используется для сброса у элемента флага, отмечающегосостояние «выбран». Давайте рассмотрим, зачем этот флаг нужени зачем его сбрасывать.6.4.8. ìÌË͇θÌÓÒÚ¸ ˝ÎÂÏÂÌÚÓ‚Одной из основных проблем в ходе выбора элементов по CSS-селекторуявляется корректность конечного набора. В случае div p у нас могутоказаться вложенные div, и если мы просто переберем все родительскиеэлементы и объединим получившиеся дочерние, то конечный набор будетсодержать дубли. Чтобы избежать такого рода ошибок, нам нужно как-тоотмечать элементы, которые мы выбрали.Это стандартная задача, и решается она, в принципе, тоже стандартно:во всех библиотеках заводится определенное свойство DOM-узлов,которое отвечает за состояние «выбран». У этого подхода есть несколькоминусов (например, нужно расширить это решение на случай асинхронныхвыборок элементов и понимать, что каждое обращение к элементамдерева ресурсоемко), но в подавляющем большинстве случаев он позволяетустранить неуникальность элементов.Схематично представить работу данного флага можно следующимобразом:for (child in children) {if (!children[child].yeasss) {if (last) {children[child].yeasss = 1;}newNodes = children[child];}}В процессе перебора нужных нам дочерних узлов мы проверяем, выставленли у этого потомка флаг yeasss (естественно, что кроме этой проверки мыдолжны удостовериться, что данный потомок нам действительно нужен). Далеемы выставляем флаг только в том случае, если работаем с последним звеномв цепочке «детей-родителей», и записываем дочерний узел в массив новыхузлов, которые станут «родителями» на следующей итерации цикла.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!