0% found this document useful (0 votes)
44 views

Dom Select Jquery

The document discusses DOM selection and jQuery. It begins by explaining the DOM API and its evolution through different levels. It then covers the Selectors API and its advantages over older methods like getElementsByTagName. Performance tests show the Selectors API and ID selector are typically fastest. The document contrasts jQuery selection methods with their native DOM equivalents, finding native versions often outperform jQuery, especially for structural pseudo-classes like :first-child versus .first(). It closes by questioning why Chrome's :nth-child implementation is relatively slow.

Uploaded by

protogizi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
44 views

Dom Select Jquery

The document discusses DOM selection and jQuery. It begins by explaining the DOM API and its evolution through different levels. It then covers the Selectors API and its advantages over older methods like getElementsByTagName. Performance tests show the Selectors API and ID selector are typically fastest. The document contrasts jQuery selection methods with their native DOM equivalents, finding native versions often outperform jQuery, especially for structural pseudo-classes like :first-child versus .first(). It closes by questioning why Chrome's :nth-child implementation is relatively slow.

Uploaded by

protogizi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 66

DOM Selecting &

jQuery

By 김훈민
NHN Technology Services Corp.
Front-End Development Team
http://huns.me
Huns.me
http://huns.me

DOM API
Document Object Model
JavaScript & DOM

Webkit & Webkit2


(Embedding API)

Bindings
(JS API, Objective-C API)

Web Core
(HTML, CSS, DOM, ETC)
JavaScript Core
(JS Engine)
Platform
(Network, Storage, Graphic)

WTF
(Data Structures, Threading)
DOM API

• DOM Level 1 ~ 3
• DOM Level 4(Working Draft)

http://www.w3.org/DOM/DOMTR
DOM Level 1 – 1998.10.1

/**
* @name getElementsByTagName
* @param { DOMString name }
* @returns { NodeList }
*/

http://www.w3.org/TR/1998/REC-DOM-Level-1-
19981001/level-one-core.html
DOM Level 2 – 2000.11.13

/*
* @name getElementById
* @param { DOMString elementId }
* @return { Element }
*/

http://www.w3.org/TR/2000/REC-DOM-Level-2-
Core-20001113/core.html
DOM Level 4 – 2014.02.04(working draft)

/*
* @name getElementsByClassName
* @param { DOMString elementId }
* @returns { NodeList }
*/

http://www.w3.org/TR/2014/WD-dom-
20140204/
Which one is
the fastest?
DOM API Performance Test

<ul>
<li>
<label>What's your name?</label>
<input id="inputBox" type="text" value="Huns">
</li>
</ul>

getElementById("inputBox");
getElementsByClassName("input-box")[0];
getElementsByTagName("input")[0];
DOM API Performance Benchmark

http://jsperf.com/dom-api-performance-test
사용 목적이 다르고,
DOM 복잡도에 따라서 성능이
달라질 수 있기 때문에
단순 비교는 무의미

어쨌든,
getElementById가 가장 빠르다.
Selectors API
querySelector, querySelectorAll
Selector…?

ul li > input[type=‘text’] {
color : red
}

http://www.w3.org/TR/2013/WD-selectors4-20130502
Simple Selector

ul { … } type selector

#huns { … } id selector

h1[title] { … } attribute selector

.huns-class { … } class selector

*{…} universal selector


Compound selector

ul li #huns { … }
Complex selector

Combinator

ul > li #huns { … }
Selector…?

?
ul li > input[type=‘text’]
Selectors API
/**
* @name querySelector
* @param { DOMString selectors }
* @return { Element }
*/

http://www.w3.org/TR/selectors-api2/
Selectors API
/*
* @name querySelectorAll
* @param { DOMString selectors }
* @return { NodeList }
*/

http://www.w3.org/TR/selectors-api2/
Selectors API

DOM4에 포함될 예정

http://www.w3.org/TR/selectors-api2/
Selectors API
Performance
Searching, Parsing
Style rules

HTML DOM
Parser Tree

ID
Attachement

CLASS
CSS Style
Parser Rule
TYPE(TAG)

UNIVERSAL
Style rules

ID • #huns
ClASS • .classname
TYPE(TAG) • ul
UNIVERSAL • *
Key Selectors

• #main-navigation { }
• body.home #page-wrap { }
• .main-navigation { }
• ul li a.current { }
• ul { }
• ul li a { }
• *{}
• #content[title='home']
Selectors API performance

일반적으로 Key Selector를


기준으로 봤을 때,

ID > CLASS > TAG > UNIVERSAL

순으로 빠르다.
Right to Left

section .contents #name {



}

#name
<div class="contents">
<ul>
<li>
<span id="name"></span>
</li>
</ul>
</div>

querySelectorAll

1. ( “#name” )
2. ( “div.contents #name”)
3. ( “div.contents li #name” )
4. ( “div.contents ul li #name” )
Right to Left Test

http://jsperf.com/decendent-test
<div class="contents">
<ul>
<li>
<span id="name"></span>
</li>
</ul>
</div>

querySelectorAll

1. ( “#name” )
2. ( “div.contents ul li > #name”)
3. ( “div.contents ul > li > #name” )
Right to Left Test

http://jsperf.com/right-to-left-css-parsing-test2/3
getElementsByTagName

V
S querySelectorAll
getElementsByTagName vs querySelectorAll

http://jsperf.com/queryselectorall-vs-
getelementsby
getElementsByTagName

DynamicNodeList

http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-536297177

https://github.com/isis-
project/WebKit/blob/master/Source/WebCore/dom/DynamicNodeList.c
pp
var HTMLCollection = document.getElementsByTagName("div");

for(var i = 0; i < HTMLCollection.length; i++){

HTMLCollection[N]
document.body.appendChild( document.createElement( "div" ) );

Infinite Loop
querySelectorAll

Query Parsing Time


StaticNodeList

http://www.w3.org/TR/selectors-api2/#findelements

https://github.com/isis-
project/WebKit/blob/master/Source/WebCore/css/StyleResolver.cpp
var nodeList = document.querySelectorAll("div");

for(var i = 0; i < nodeList .length; i++){

NodeList[N]
document.body.appendChild( document.createElement( "div" ) );

}
createSelectorNodeList

http://trac.webkit.org/browser/trunk/WebCore/do
m/SelectorNodeList.cpp?rev=41093#L61
return StaticNodeList::adopt(nodes);
Native vs jQuery

jQuery Selector
In jQuery selector

$( “#first” ) getElementById

$( “li” ) getElementsByTagName

$( “.classname” ) getElementsByClassName

$( “ul li:first-child” ) querySelectorAll


Native

V
S jQuery
Native vs jQuery Performance

getElementById(“#lg_link_msg”)

querySelector(“#lg_link_msg” )

$( “#lg_link_msg” )
Native vs jQuery Performance

http://jsperf.com/id-class-tag-universal-performance-test-on-
naver-main
Native vs jQuery Performance

Native > jQuery


구조 가상 클래스

Structural
Pseudo Classes
&
jQuery
구조 가상 클래스

Structural Pseudo Classes…?

:first-child
:last-child
:nth-child
:only-child
:empty
.
.
jQuery Method Support

$( “ul li:first-child”) $( “ul li”).first();

$( “ul li:last-child”) $( “ul li”).last();

$( “ul li:nth-child(N)”) $( “ul li”).eq(N);


$( “ul li:first-child”)

V
S $( “ul li”).first()
:first-child vs .first()

<ul>
<li>Hello World</li>
<li>Hello World</li>
<li>Hello World</li>
.
. x1
. x 500
</ul>
x 1000
:first-child vs .first() x 1
:first-child vs .first() x 500
:first-child vs .first() x 1000

일반적으로,
:first-child > .first()

엘리먼트 수가 적다면,
:first-child <= .first()
$( “ul li:last-child”)

V
S $( “ul li”).last()
:last-child vs .last() x 1
:last-child vs .last() x 500
:last-child vs .last() x 1000

일반적으로,
:last-child > .last()

엘리먼트 수가 적다면,
:last-child <= .last()
$( “ul li:nth-child(N)”)

V
S $( “ul li”).eq(N)
jQuery.eq(N)

$( … ).eq(N)는…

$( … )[N] 와 비슷한 성능을 보임


:nth-child vs eq() x 1
:nth-child vs eq() x 500
:nth-child vs eq() x 1000

일반적으로,
:nth-child > .eq()

엘리먼트 수가 적다면,
:nth-child <= .eq()
.
.
크롬은 예외
:first-child

V :nth-child(1)

S .eq(0)
:nth-child vs :first-child vs .eq()
Why
chrome’s
nth-child rule
is
too slow?
Sorry,
I don’t know.

I’ll be back.
Thanks.

You might also like