Dom Select Jquery
Dom Select Jquery
Dom Select Jquery
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
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
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
순으로 빠르다.
Right to Left
#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");
HTMLCollection[N]
document.body.appendChild( document.createElement( "div" ) );
Infinite Loop
querySelectorAll
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");
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
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
Structural
Pseudo Classes
&
jQuery
구조 가상 클래스
:first-child
:last-child
:nth-child
:only-child
:empty
.
.
jQuery Method Support
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)는…
일반적으로,
: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.