Механизмы селектора Framework, как правило, оцениваются справа-на-первых, поэтому я ожидал, что контекстный селектор идентификатора document.getElementById
ID, а затем проверил бы, были ли результаты в узле контекста, увеличивая parentNode
s. , Это достаточно быстро, но оно не будет работать для DOM-деревьев вне документа, как в этом примере. Тогда двигатели селектора должны будут делать это крайне медленно, или не заботиться (например, Sizzle не работает с DocumentFragment
).
Существует лучший способ получить идентификатор внутри фрагмента, который я запомнил с тех пор, для браузеров, реализующих Selectors-API (IE8, Firefox 3.5, Opera 10, Safari 3.1, Chrome 3) , Вы можете использовать querySelector
, чтобы применить селектор CSS с DocumentFragment
в качестве узла контекста, поскольку API требует DocumentFragment
реализует NodeSelector
:
alert(frag.querySelector('#myId'))
Это не так быстро, как getElementById
, но загружается лучше, чем версия DOM.
К сожалению, большинство фреймворков, которые имеют оптимизацию Selectors-API, не будут использовать их в этом случае или любые другие с узлами контекста, потому что способ работы узла контекста отличается в querySelector
[All
] от того, как фреймворки традиционно реализовал это, делая их несовместимыми.
Selectors-API Level 2 предлагает «ограниченные» методы, которые ведут себя как традиционные селекторы фреймворка ... пройдет некоторое время, прежде чем его можно будет использовать, но мы, вероятно, не увидим оптимизированных контекстных селекторов в существующие рамки до тех пор. Я думаю, что это позор, так как хотя querySelector
метод использования узла контекста для фильтрации, но не определения области видимости, не так хорош, он все еще в значительной степени применим для всех распространенных случаев.