Selections - zziuni/d3 GitHub Wiki
Wiki โธ API Reference โธ Core โธ Selections
์ ํ๋ฌผ(selection) ์ ํ์ฌ ๋ฌธ์์์ ๊ฐ์ ธ์จ ๋ฌธ์์์์ ์งํฉ์ด๋ค. D3๋ ๋ฌธ์์์ ์ ํ์ CSS3๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด์, ํ๊ทธ("div"), CSSํด๋์ค(".awesome"), ID("#foo"), Html ์์ฑ("[color=red]"), ์ปจํ ์ด๋("parent child")๋ก ์ ํํ ์ ์๋ค. ์ ํ์๋ AND(".this.that")๋ OR(".this .that")๋ก ๊ฒฐํฉํ ์๋ ์์ผ๋ฉฐ, ์ ํ์๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด์ D3์ด์ ์ Sizzle์ ์ถ๊ฐํ ์ ์๋ค.
๋ฌธ์์์๋ฅผ ์ ํํ ํ์๋ ์์ ์ ํ๊ธฐ์ํด์ ์ฐ์ฐ์(operator) ๋ฅผ ์ ์ฉํ ์ ์๋ค. ์ฐ์ฐ์๋ ์ปจํ ์ธ ์ ์์ฑ(attributes), ์คํ์ผ(styles), ํ๋กํผํฐ(properties), HTML, ํ ์คํธ(text)๋ฅผ ๊ฐ์ ธ์ค๊ณ (get) ์ง์ (set)ํ ์ ์๋ค. Attribute๋ฑ์ ์ด๋ฐ ๊ฐ๋ค์๋ ์์๋ ํจ์๊ฐ ์ง์ ๋๊ณ ์ ํํ ๊ฐ ์์๋ณ๋ก ์ ์ฉ๋๋ค. ์ ํ๋ฌผ์ ๋ฐ์ดํฐ(data)์ ์ฐ๊ฒฐํ ์๋ ์๋ค. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ์ค์ฌ์ ๋ณํ์ ์ํด ์กฐ์ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ์ฐ๊ฒฐ์ ํ๋ฉด ํ์ ์ ํ๋ฌผ๋ก ๋ค์ด๊ฐ๊ธฐ(enter)๊ณผ ๋์ค๊ธฐ(exit)๊ฐ ์ผ์ด๋๋ค. ๊ทธ๋์ ์ฌ๋ฌ๋ถ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ผ๋ก ๊ฒฐ๊ณผ ๋ฌธ์์์๋ฅผ ์ถ๊ฐ(add)ํ๊ฑฐ๋ ์ ๊ฑฐ(remove)ํ ์ ์๋ค.
D3์์๋ ๋ฌธ์ ์์ ์ ์ํด์ for
๋ฅผ ์ด์ฉํ ๋ฃจํ๋ฌธ์ด๋ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. ๊ทธ ์ด์ ๋ ๊ฐ๋ณ ๋ฌธ์์์๋ฅผ ์ํํ๋ ๋์ ์ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ๋ชจ๋ ์ ํ๋ฌผ์ ํ๋ฒ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ฌ์ ํ ๊ฐ๋ฐ์๊ฐ ์ํ๋ฉด ์์์ ํจ์๋ฅผ ํธ์ถํ๋ each์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ์๋์ผ๋ก ๋ฌธ์์์๋ฅผ ๋ฃจํ ๋๋ฆด ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฌผ์ ๋ฐฐ์ด์ด๋ผ์ ๋ฌธ์์์๋ฅผ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค( selection[0][0]
). D3๋ ๋ฉ์๋ ์ฑ์ด๋์ ์ง์ํ๋ค. ์ด๋ฅผ ์ด์ฉํด์ ์ฌ๋ฌ ์ฐ์ฐ์๋ฅผ ์ ์ฉํ ๋ ํํ์ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ค. ์ด ๋ ์ฐ์ฐ์์ ๋ฐํ๊ฐ์ ๊ทธ ์ ํ๋ฌผ์ด๋ค.
D3๋ ๋ฌธ์์์๋ฅผ ์ ํํ๊ธฐ ์ํด์ ์ต์์ ๋ ๋ฒจ์ ๋ฉ์๋ ๋๊ฐ๋ฅผ ์ ๊ณตํ๋ค. select๊ณผ selectAll์ด๋ค. ์ด๋ค์ ์
๋ ํฐ ๋ฌธ์์ด์ ์ธ์๋ก ๋ฐ๋๋ค. ์ ์๋ ์ผ์นํ๋ ๋ฌธ์์์์ค ์ฒซ๋ฒ์งธ ๋ฌธ์์์๋ง ์ ํํ๊ณ , ํ์๋ ๋ฌธ์์์ ์์๋๋ก ์ผ์นํ๋ ๋ชจ๋ ๋ฌธ์์์๋ฅผ ์ ํํ๋ค. ์ธ์๋ ์
๋ ํฐ ๋ฌธ์์ด ๋ฟ์ด ์๋๋ผ DOM ๋
ธ๋(node)๋ฅผ ๋ฐ์ ์๋ ์๋ค. ๊ทธ๋์ jQuery๋ ๊ฐ๋ฐํด($0
) ๊ฐ์ ์ํธํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉ์ด ์ฉ์ํ๋ค.
# d3.select(selector)
์ธ์๋ก ์ง์ ํ ์ ๋ ํฐ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์๋ฅผ ์ ํํ๋ค. ๋จ์ผ ๋ฌธ์์์๋ฅผ ์ ํํด์ ๋ฐํํ๋ค. ์ง์ ํ ์ ๋ ํฐ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ๋ฌธ์์์๊ฐ ํ์ฌ ๋ฌธ์์ ์๋ค๋ฉด ๋น ์ ํ๋ฌผ์ ๋ฐํํ๋ค. ์ ๋ ํฐ์ ์ผ์นํ๋ ๋ฌธ์์์๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด ๋ฌธ์์์์ ์ฒซ๋ฒ์งธ๋ก ์ผ์นํ๋ ๋ฌธ์์์๋ฅผ ์ ํํ๋ค.
# d3.select(node)
์ธ์๋ก ์ง์ ํ ๋
ธ๋( node )๋ฅผ ์ ํํ๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋์์ d3.select(this)
๊ฐ์ด ์ ํํ ๋
ธ๋๋ document.body
๊ฐ์ด ์ ํํ ์ ์ญ ๋
ธ๋์ ๋ํ ์ฐธ์กฐ๊ฐ์ ์ด๋ฏธ ๊ฐ์ง๊ณ ์์ ๋ ์ ์ฉํ๋ค.
# d3.selectAll(selector)
์ธ์๋ก ์ง์ ํ ์ ํ์( selector )์ ์ผ์นํ๋ ๋ชจ๋ ๋ฌธ์์์๋ฅผ ์ ํํ๋ค. ๋ฌธ์์์๋ ๋ฌธ์์์ ์์๋๋ก(์์์ ์๋๋ก) ์ ํ๋๋ค. ํ์ฌ ๋ฌธ์์ ์ ํ์์ ์ผ์นํ๋ ๋ฌธ์์์๊ฐ ์๋ค๋ฉด ๋น ์ ํ๋ฌผ์ ๋ฐํํ๋ค.
# d3.selectAll(nodes)
์ธ์๋ก ์ง์ ํ ๋ฌธ์์์์ ๋ฐฐ์ด์ ์ ํํ๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋์์ d3.selectAll(this.childNodes)
๊ฐ์ด ์ ํํ ๋
ธ๋๋ document.links
๊ฐ์ด ์ ํํ ์ ์ญ ๋
ธ๋์ ๋ํ ์ฐธ์กฐ๊ฐ์ ์ด๋ฏธ ๊ฐ์ง๊ณ ์์ ๋ ์ ์ฉํ๋ค. ์ธ์ nodes ๋ ๋ช
ํํ๊ฒ ๋ฐฐ์ด์ ์๋๋ค. ๋ฐฐ์ด๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ ์ฌ๋ฐฐ์ด์ด ๋์ํ๋ค.(NodeList
๋ arguments
)
์ ํ๋ฌผ์ ๋ง๊ทธ๋๋ก ๋ฌธ์์์์ ๋ฐฐ์ด์ด๋ค. ๊ทธ๋ฆฌ๊ณ D3๋ ๋ฐฐ์ด์ ํ์ฅ ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ํ๋ค. ๊ทธ๋์ ์ ํํ ๋ชจ๋ ๋ฌธ์์์์ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ๊ฐ์ ์ ํ๋ ๋ฌธ์์์์ ์ฐ์ฐ์๋ฅผ ์ ์ฉํ ์ ์๋ค. ๊ทธ ์ ํ๋ฌผ์ ์ผ์ฐจ์ ๋ฐฐ์ด์ด ์๋ ์ ํ๋ฌผ์ด ๋ฌธ์์์ ๋ฐฐ์ด์ ๋ฐฐ์ด์ธ ๊ทธ๋ฃน ์ด๋ค. ์ด๋ ํ์์ ํ๋ฌผ์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ค. ์ง๊ธ์ ์ด๋ฐ ์ธ๋ถ์ฌํญ์ ๋ฌด์ํ ์๋ ์์ง๋ง ์ด๊ฒ์ด ์ ํ๋ฌผ์ด [node]
์ด ์๋๋ผ [[node]]
๋ก ๋ณด์ด๋ ์ด์ ๋ค. ์ค์ฒฉ ์ ํ๋ฌผ์ ๋ํ ์์ธ๋ด์ฉ์ Nested Selections๋ฅผ ๋ณด๋ผ.
์ ํ๋ฌผ์ด ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด, ๋ฌธ์์์ ์ ํ์ ์ฌ๋ฌ๋ถ์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ ์ฝ์์์ ์ดํด๋ณด๋ผ. ๋ฌธ์์์๊ฐ ์ ํ๋ ์์น๋ฅผ ๋ณด๊ณ ๊ทธ๋ฃนํ๋ ๋ฐฉ๋ฒ์ ๋ณด๊ธฐ์ํด์ ๋ฐํ๋ ๋ฐฐ์ด์ ๋ค์ ๋ณผ ์ ์๊ณ ์ ํ๋ ๋ฌธ์์์์ ์ฐ์ฐ์๋ฅผ ์ ์ฉํด์ ํ์ด์ง ์ปจํ ์ธ ๊ฐ ์ด๋ป๊ฒ ๋ฐ๋๋์ง ๋ณผ ์๋ ์๋ค.
D3์๋ ๋ฌธ์ ๋ด์ฉ์ ์ํฅ์ ์ฃผ๋ ์ฐ์ฐ์๋ค์ด ์๋ค. ๊ทธ์ค ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉํ๋ค. ๋ฌธ์ ๋ด์ฉ์ ์ง์ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ ๋ ์ฐ์ฐ์๋ ํ์ฌ ์ ํ๋ฌผ์ ๋ฐํํ๋ค. ๊ทธ๋์ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ผ๋ก ์ฌ๋ฌ ์ฐ์ฐ์๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ค.
# selection.attr(name[, value])
value ์ธ์๋ฅผ ์ง์ ํ๋ฉด ์ ํํ ๋ชจ๋ ๋ฌธ์์์์์ ์ง์ ํ ์์ฑ๋ช
์ ๊ฐ์ผ๋ก ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๊ฐ ๊ฐ์ ์์ฑ๊ฐ์ด ์ฃผ์ด์ง์ง๋ง value ๊ฐ ํจ์์ด๋ฉด ๊ฐ ์ ํ๋ ๋ฌธ์์์๋ณ๋ก ์์๋๋ก ์ ์ฉ๋๋ค. ์ด ํจ์๋ ์ ๋ฌ์ธ์๋ก datum d
์ ์ธ๋ฑ์ค i
๊ฐ ๋์ด์ค๊ณ this
๋ ํ์ฌ DOM ๋ฌธ์์์๋ค. ํจ์ ๋งํ ๊ฐ์ด ๊ฐ ๋ฌธ์์์์ ์์ฑ ๊ฐ์ง์ ์ ์ฌ์ฉ๋๋ค. null ๊ฐ์ ์ง์ ํ ์์ฑ์ ์ ๊ฑฐํ๋ค.
value ์ธ์๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ์ง์ ์์ฑ ๊ฐ์ ๋ฐํํ๋ค. ์ด๋ ์ ํ๋ฌผ์ด ํ์คํ๊ฒ ๋ฌธ์์์๋ฅผ ํ๋๋ง ๋ด๊ณ ์๋ค๋ ์ฌ์ค์ ๊ฐ๋ฐ์๊ฐ ์๊ณ ์์ ๋๋ง ์ ์ฉํ๋ค.
XLink ๋ค์์คํ์ด์ค์์ "href" ์์ฑ์ ์ง์ ํ๊ธฐ์ํด์ xlink:href
๋ผ๊ณ ํ๋ฏ, name ์ธ์์ ๋ค์์คํ์ด์ค ์ ๋์ฌ๊ฐ ์์ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก D3๋ svg, xhtml, xlink, xml, xmlns ๋ค์์คํ์ด์ค๋ฅผ ์ง์ํ๋ค. ๋ณ๋์ ๋ค์์คํ์ด์ค๋ d3.ns.prefix๋ฅผ ์ฌ์ฉํด์ ๋ฑ๋กํ ์ ์๋ค.
name ์ธ์์๋ name๊ณผ value ์์ฑ์ ๊ฐ์ง ๊ฐ์ฑ๋ ์ฌ ์ ์๋ค.
# selection.classed(name[, value])
์ด ์ฐ์ฐ์๋ "class"์์ฑ์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ํ ํฐ ์ธํธ๋ผ๋๊ฑธ ์ธ์ํ๋ "class" ์์ฑ์ ์ง์ ํ๊ธฐ ์ํ ํธํ ์๋จ์ด๋ค. ์ด๋ฐ ์ ์ ํ์ CSS ํด๋์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์ถ๊ฐ, ์ ๊ฑฐ, ํ ๊ธํ๊ธฐ์ํด์ ๊ฐ๋ฅํ๋ฉด classList ๋ฅผ ์ฌ์ฉํ๋ค.
value ์ธ์๋ฅผ ์ง์ ํ๋ฉด ์ ํ ๋ฌธ์์์์ ์ฐ๊ด๋ ์ง์ ํ ํด๋์ค๋ฅผ ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด์ true์ ํด๋นํ๋ ๊ฐ์ธ ๊ฒฝ์ฐ, ์์ง ํด๋์ค๊ฐ ํ ๋น๋์ง ์์๋ค๋ฉด, ์ง์ ํ ํด๋์ค๋ฅผ ๋ชจ๋ ๋ฌธ์์์์ ํ ๋นํ๋ค. false์ ํด๋นํ๋ ๊ฐ์ด๋ฉด์ ํ ๋น๋์๋ค๋ฉด ๊ทธ ํด๋์ค๋ ๋ชจ๋ ์ ํ ๋ฌธ์์์์์ ์ ๊ฑฐ๋๋ค. value ๊ฐ ํจ์์ธ ๊ฒฝ์ฐ ๊ทธ ํจ์๋์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์๋ณ๋ก ์์๋๋ก ๋์ํ๋ค. ์ ๋ฌ์ธ์๋ ๋ฐ์ดํ
d
์ ์ธ๋ฑ์ค i
์ด๊ณ this
๋ ํ์ฌ DOM ๋ฌธ์์์์ด๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ํด๋์ค๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ ๊ฑฐํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
value ์ธ์๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์๊ฐ ์ง์ ํ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ์๋ง true๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋์ ๋ณดํต์ ์ ํ๋ฌผ์ด ๋ช ํํ๊ฒ ํ๋์ ์์๋ง ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ธ๋ชจ๊ฐ ์๋ค.
# selection.style(name[, value[, priority]])
value ์ธ์๋ฅผ ๋๊ธฐ๋ฉด ์ด ๊ฐ์ ์ ํํ ๋ชจ๋ ๋ฌธ์์์์์ ์ง์ ํ ์ด๋ฆ์ CSS ์คํ์ผ ํ๋กํผํฐ์ ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๋ ๋์ผ ์คํ์ผ ๊ฐ์ด ์ฃผ์ด์ง์ง๋ง value ๊ฐ ํจ์์ด๋ฉด ๊ทธ ํจ์๋ ์ ํ๋ ๊ฐ ๋ฌธ์์์๋ณ๋ก ์์๋๋ก ๋์ํ๋ค. ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ ๋ฐ์ดํ
d
์ ์ธ๋ฑ์ค i
์ด๊ณ this
๋ ํ์ฌ DOM ๋ฌธ์์์์ด๋ค. ํจ์์ ๋ฐํ ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ์คํ์ผ ํ๋กํผํฐ๋ฅผ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. null ๊ฐ์ ์ง์ ํ ์ด๋ฆ์ ์คํ์ผ ํ๋กํผํฐ๋ฅผ ์ ๊ฑฐํ๋ค. ๊ทธ๋ฆฌ๊ณ null์ด๋ "important"๋ก priority ์ธ์๋ฅผ ์ง์ ์๋ ์๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ์ง์ ์คํ์ผ ํ๋กํผํฐ์ ๊ณ์ฐ๋ ํ์ฌ๊ฐ์ ๋ฐํํ๋ค. ์ด๋ ์ ํ๋ฌผ์ด ๋ช ํํ๊ฒ ํ๋์ ๋ฌธ์์์๋ง ๋ด๊ณ ์๋ค๋ ์ฌ์ค์ ์๊ณ ์์ ๋๋ง ์ธ๋ชจ๊ฐ ์๋ค. ๊ณ์ฐ๋ ๊ฐ์ ์ด์ ์ ์ง์ ํ๋ ๊ฐ๊ณผ ๋ค๋ฅผ ์ ์๋ค.ํนํ ์คํ์ผ ํ๋กํผํฐ๊ฐ ์ถ์ฝํ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด์ ์ง์ ํ๋ค๋ฉด ๋ง์ด๋ค. (์๋ฅผ ๋ค๋ฉด "font-size", "font-face"์ ์ถ์ฝํ์ "font"์ด๋ค. )
# selection.property(name[, value])
๋ช๊ฐ์ง HTML ๋ฌธ์์์๋ ํ์ค ์์ฑ์ด๋ ์คํ์ผ ์ฌ์ฉ์ ๊ณ ๋ คํ์ง ์์ ๋ณ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์๋ฅผ ๋ค์ด, ํผ์ ํ
์คํธ ํ๋๋ value
๋ผ๋ ๋ฌธ์์ด ํ๋กํผํฐ๊ฐ ์๊ณ ์ฒดํฌ๋ฐ์ค๋ checked
๋ผ๋ ๋ธ๋ฆฌ์ธ ํ๋กํผํฐ๊ฐ ์๋ค. ์ฌ๋ฌ๋ถ์ ์ด๋ฐ ํ๋กํผํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ฐ์ ์ง์ ํ๊ธฐ ์ํด์ property
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋๋ฉด className
๊ฐ์ด ๊ธฐ๋ฐ ๋ฌธ์์์์์ ๋ค๋ฅด๊ฒ ๋ค๋ฃฐ์ ์๋ ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ๋ฉด ์ด ๊ฐ์ ์ ํํ ๋ชจ๋ ๋ฌธ์์์์์ ์ง์ ํ ์ด๋ฆ์ ํ๋กํผํฐ์ ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๋ ๋์ผํ ํ๋กํผํฐ ๊ฐ์ด ์ฃผ์ด์ง์ง๋ง, value ๊ฐ ํจ์๋ฉด ๊ทธ ํจ์๋ ์ ํํ ๊ฐ ๋ฌธ์์์์์ ์์๋๋ก ๋์ํ๋ค. ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ ๋ฐ์ดํ
d
์ ์ธ๋ฑ์ค i
์ด๊ณ this
๋ ํ์ฌ DOM ๋ฌธ์์์์ด๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ํ๋กํผํฐ ๊ฐ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. null์ ์ง์ ํ ์์ฑ์ ์ ๊ฑฐํ๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ์ง์ ํ๋กํผํฐ ๊ฐ์ ๋ฐํํ๋ค. ์ด๋ ์ ํ๋ฌผ์ด ๋ช ํํ๊ฒ ํ๋์ ๋ฌธ์์์๋ง ๋ด๊ณ ์๋ค๋ ์ฌ์ค์ ์๊ณ ์์ ๋๋ง ์ธ๋ชจ๊ฐ ์๋ค.
# selection.text([value])
text
์ฐ์ฐ์๋ textContent ํ๋กํผํฐ์ ๊ธฐ์ดํ๋ค. ๊ทธ๋์ ํ
์คํธ ์ปจํ
์ธ ๋ฅผ ์ง์ ํ๋ฉด ์กด์ฌํ๋ ํ์ ๋ฌธ์์์๋ ๋ชจ๋ ํ
์คํธ ์ปจํ
์ธ ๋ก ๊ต์ฒด๋๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ๋ฉด ๊ทธ ๊ฐ์ ์ ํํ ๋ชจ๋ ๋ฌธ์์์์์ ํ
์คํธ ์ปจํ
์ธ ๋ก ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ฌด๋ ๋ฌธ์์์๋ ๊ฐ์ ํ
์คํธ ๋ด์ฉ์ด ๋์ง๋ง, value ๊ฐ ํจ์์ด๋ฉด ๊ทธ ํจ์๋ ์ ํํ ๊ฐ ๋ฌธ์์์์์ ์์๋๋ก ๋์ํ๋ค. ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ ๋ฐ์ดํ
d
์ ์ธ๋ฑ์ค i
์ด๊ณ this
๋ ํ์ฌ DOM ๋ฌธ์์์์ด๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ํ๋กํผํฐ ๊ฐ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. null์ ์ง์ ํ ์์ฑ์ ์ ๊ฑฐํ๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ์ง์ ํ๋กํผํฐ ๊ฐ์ ๋ฐํํ๋ค. ์ด๋ ์ ํ๋ฌผ์ด ๋ช ํํ๊ฒ ํ๋์ ๋ฌธ์์์๋ง ๋ด๊ณ ์๋ค๋ ์ฌ์ค์ ์๊ณ ์์ ๋๋ง ์ธ๋ชจ๊ฐ ์๋ค.
# selection.html([value])
html
์ฐ์ฐ์๋ innerHTML ํ๋กํผํฐ์ ๊ธฐ์ดํ๋ค. ๊ทธ๋์ inner HTML ์ปจํ
์ธ ๋ฅผ ์ง์ ํ๋ฉด ์กด์ฌํ๋ ํ์ ๋ฌธ์์์๋ ๋ชจ๋ ์ง์ ํ HTML๋ก ๊ต์ฒด๋๋ค. ์๋๋ฉด, ๋ฐ์ดํฐ ์ค์ฌ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก HTML ์ปจํ
์ธ ๋ฅผ ์์ฑํ๊ธฐ์ํด์๋ append
๋ insert
์ฐ์ฐ์ ์ฌ์ฉ์ ์ ํธํ ์๋ ์๋ค. ์ด ์ฐ์ฐ์๋ ๋น๊ต์ ์ ์ HTML์ ์ํ ๋๋ฅผ ์ํด์ ๊ณ ์๋์๋ค. ๋ฆฌ์น ํฌ๋ฉํ
์ด๋ผ ํ๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ๋ฉด ๊ทธ ๊ฐ์ผ๋ก ์ ํํ ๋ชจ๋ ๋ฌธ์์์์์ inner HTML ์ปจํ
์ธ ๋ฅผ ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๋ ๊ฐ์ inner HTML ์ปจํ
์ธ ๊ฐ ๋์ง๋ง, value ๊ฐ ํจ์์ด๋ฉด ๊ทธ ํจ์๋ ์ ํํ ๊ฐ ๋ฌธ์์์์์ ์์๋๋ก ๋์ํ๋ค. ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ ๋ฐ์ดํ
d
์ ์ธ๋ฑ์ค i
์ด๊ณ this
๋ ํ์ฌ DOM ๋ฌธ์์์์ด๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ํ๋กํผํฐ ๊ฐ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. null์ ์ง์ ํ ์์ฑ์ ์ ๊ฑฐํ๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ์ง์ ํ๋กํผํฐ ๊ฐ์ ๋ฐํํ๋ค. ์ด๋ ์ ํ๋ฌผ์ด ๋ช ํํ๊ฒ ํ๋์ ๋ฌธ์์์๋ง ๋ด๊ณ ์๋ค๋ ์ฌ์ค์ ์๊ณ ์์ ๋๋ง ์ธ๋ชจ๊ฐ ์๋ค.
# selection.append(name)
ํ์ฌ ์ ํ๋ฌผ์์ ๊ฐ ๋ฌธ์์์์ ๋ง์ง๋ง ์์์ผ๋ก ์ง์ ํ name ์ ์ ๊ท ๋ฌธ์์์๋ฅผ ์ถ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐํ ๋ฌธ์์์๋ฅผ ํฌํจํ ์๋ก์ด ์ ํ๋ฌผ์ ๋ฐํํ๋ค. ๊ฐ๊ฐ์ ์๋ก์ด ๋ฌธ์์์๋ ๋ถ๋ชจ ๋ฌธ์์์์ ๋ฐ์ดํฐ๋ฅผ ์์ํ๋ค. ๋ง์ฝ ์์ผ๋ฉด ํ์ ์ ํ๋ฌผ์ ๋ํ select๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ ๋ฌ์ธ์ name ์ ์์๋ก ์ ๋ฌํด์ผ๋ง ํ๋ค. ์ฐจํ์ ์ธ์๋ก ์กด์ฌํ๋ ๋ฌธ์์์๋ ๋์ ์ผ๋ก ์ด๋ฆ ์์ฑ์ ์ํ ํจ์ ์ฌ์ฉ์ ์ง์ํ ๊ณํ์ด๋ค.
๋ฌธ์์์์ ํ๊ทธ ๋ช
(name)
์๋ SVG ๋ค์์คํ์ด์ค์ "text" ๋ฌธ์์์๋ฅผ ์์ฑํ๊ธฐ์ํ "svg:text"๊ฐ์ ๋ค์์คํ์ด์ค ์ ๋์ฌ๊ฐ ์์ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก D3๋ svg, xhtml, xlink, xml, xmlns ๋ค์์คํ์ด์ค๋ฅผ ์ง์ํ๋ค. d3.ns.prefix๋ฅผ ์ฌ์ฉํด์ ์ถ๊ฐ ๋ค์์คํ์ด์ค๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
# selection.insert(name, before)
ํ์ฌ ์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์์์ before ์ ๋ ํฐ์ ์ผ์นํ๋ ๋ฌธ์์์ ์์ name ์ผ๋ก ๋ช ๋ช ํ ์๋ก์ด ๋ฌธ์์์๋ฅผ ์ฝ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ์ ํ ๋ฌธ์์์๋ฅผ ์ถ๊ฐํ ์๋ก์ด ์ ํ๋ฌผ์ ๋ฐํํ๋ค. before ์ ๋ ํฐ์ ์ผ์นํ๋ ๋ฌธ์์์๊ฐ ์์ผ๋ฉด ์ถ๊ฐํ ์ ๋ฌธ์์์๋ append์ฒ๋ผ ๋งจ ๋์ ์์์์๊ฐ ๋๋ค. ๊ฐ๊ฐ์ ์๋ก ์ถ๊ฐ๋๋ ๋ฌธ์์์๋ ์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์์ ๋ฐ์ดํฐ๋ฅผ ์์ํ๋ค. ํ์ ์ ํ๋ฌผ์ select์์๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ๋ ์ ๋ฌ์ธ์๋ ๋ฐ๋์ ์์์ฌ์ผ ํ๋ค. ์ฐจํ์ ์กด์ฌํ๋ ๋ฌธ์์์๋ ๋์ ์ผ๋ก name ์ด๋ before ์ ๋ ํฐ๋ฅผ ์์ฑํ๋ ํจ์ ์ฌ์ฉ์ ์ง์ํ ๊ณํ์ด๋ค.
์๋ฅผ ๋ค์ด, insert("div", ":first-child")
๋ ํ์ฌ ์ ํ๋ฌผ์ div ์์ ๋
ธ๋๋ฅผ ์์ ์ถ๊ฐํ๋ค.
๋ฌธ์์์์ ํ๊ทธ ๋ช
(name)
์๋ SVG ๋ค์์คํ์ด์ค์ "text" ๋ฌธ์์์๋ฅผ ์์ฑํ๊ธฐ์ํ "svg:text"๊ฐ์ ๋ค์์คํ์ด์ค ์ ๋์ฌ๊ฐ ์์ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก D3๋ svg, xhtml, xlink, xml, xmlns ๋ค์์คํ์ด์ค๋ฅผ ์ง์ํ๋ค. d3.ns.prefix๋ฅผ ์ฌ์ฉํด์ ์ถ๊ฐ ๋ค์์คํ์ด์ค๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
# selection.remove()
ํ์ฌ ๋ฌธ์์ ํ์ฌ ์ ํ๋ฌผ์์ ๋ฌธ์์์๋ฅผ ์ ๊ฑฐํ๋ค. ๋ฌธ์์ ๋ค์ ๋ค์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์์์๋ฅผ ์ ๊ฑฐํ ํ์๋ ๊ทธ ์ ํ๋ฌผ ์ฌ์ฉ์ ๋ฉ์ถฐ์ผ ํ๋ค. ( ์ถ๊ฐ๋ ๋ฐ๋ก ์์์ ์ค๋ช ํ append์ insert ์ฐธ๊ณ )
# selection.data([values[, key]])
ํ์ ์ ํ๋ฌผ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์ฐ๊ฒฐํ๋ค. ์ธ์ values ๋ ์ซ์๋ ๊ฐ์ฒด ๋ฐฐ์ด ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ๋ค์ ๋ฐฐ์ด์ด๊ฑฐ๋ ๊ทธ๋ฐ ๋ฐฐ์ด์ ๋ฐํํ๋ ํจ์๋ค. key ํจ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด, ์ ๋ฌํ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํ
(datum)์ ํ์ฌ ์ ํ๋ฌผ์ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ํ ๋นํ๊ณ , ๋๋ฒ์งธ ๋ฐ์ดํ
์ ๋๋ฒ์งธ ๋ฌธ์์์์... ์ด๋ฐ์์ผ๋ก ํ ๋นํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋ฌธ์์์์ ํ ๋น๋๋ฉด, ๊ทธ ๊ฐ์ __data__
ํ๋กํผํฐ์ ์ ์ฅ๋๋ค. ๊ทธ๋์ ์ ํ๋ฌผ์ ์ฌ ์ ํ ํ์ ๋ ๋ฐ์ดํฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ฌธ์์์์ ์ง ๋ฌ๋ผ๋ถ๊ฒ ๋ง๋ ๋ค.
values ๋ฐฐ์ด์ ์ ํ๋ฌผ ์์ ๊ฐ ๊ทธ๋ฃน์ ๋ํด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ํ๋ฌผ์ด ์ฌ๋ฌ๊ฐ์ ๊ทธ๋ฃน(d3.selectAll๋ฅผ ์ด์์ selection.selectAll๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ฒ๋ผ) ์ด๋ฉด, data ๋ ๋ฐฐ์ด์ ๋ฐํํ๋ ํจ์๋ก ์ง์ ํด์ผ ํ๋ค(๊ฐ ๊ทธ๋ฃน๋ณ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ด๋นํ๋ ค ํ๋ค๊ณ ๊ฐ์ ํ ๋). ์๋ฅผ ๋ค์ด, ์ต์ด ์ ํ๋ฌผ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฐ๊ฒฐํ๋ค ์น์. ๊ทธ๋ฌ๋ฉด ๊ฐ ํ์ ์ ํ๋ฌผ์๋ ์์ชฝ ๋ฐฐ์ด์ด ์ฐ๊ฒฐ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ values ํจ์๋ ํญ๋ฑ ํจ์(identity function)์ด๊ณ , ์ด ํจ์๋ ์์ ๋ฌธ์์์๋ค์ ๊ฐ์ง ๊ฐ ๊ทธ๋ฃน์์ ํธ์ถ๋๊ณ ๋ถ๋ชจ ๋ฌธ์์์์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์์ ์ด ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
var matrix = [
[11975, 5871, 8916, 2868],
[ 1951, 10048, 2060, 6171],
[ 8010, 16145, 8090, 8045],
[ 1013, 990, 940, 6907]
];
var tr = d3.select("body").append("table").selectAll("tr")
.data(matrix)
.enter().append("tr");
var td = tr.selectAll("td")
.data(function(d) { return d; })
.enter().append("td")
.text(function(d) { return d; });
๋ฌธ์์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ ์ฐ๊ฒฐํ๊ณ ์ถ์ ๋๋ ์ธ์ key ์ key ํจ์๋ฅผ ์ง์ ํ๋ค. ์ด ํจ์๋ ์์ฐจ์ ์ธ ๋์์์๋ ๊ธฐ๋ณธ ๋์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค. key ํจ์๋ ์ ๊ท ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ฐ ์์๋ณ๋ก ํธ์ถ๋ ํ, ์ ํ๋ฌผ์์ ์กด์ฌํ๋ ๋ฌธ์์์๋ณ๋ก ๋ค์ ์คํ๋๋ค. ์ด ๋๊ฐ์ง ๊ฒฝ์ฐ์ key ํจ์๋ ์ธ์๋ก ๋ฐ์ดํ
d
์ ์ธ๋ฑ์ค i
๋ฅผ ์ ๋ฌ๋ฐ๋๋ค. key ํจ์๊ฐ ๋ฐ์ดํฐ์ ์๋ณ๋ก ์ฑํ๋ ๋, ํจ์ ๋ด์์ this
๋ ๋ฐ์ดํฐ ๋ฐฐ์ด์ด๊ณ , key ํจ์๊ฐ ์กด์ฌํ๋ ์ ํ๋ฌผ์์ ์คํ๋ ๋๋ this
๊ฐ ๊ด๋ จ DOM ๋ฌธ์์์๋ค. key ํจ์์ ๋ฐํ ๊ฐ์ ์ฌ์ ์ ์ฐ๊ฒฐํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ํด๋นํ๋ ๋ฌธ์์์์ ๋ฐ์ดํ
์ ์ฐ๋ํ๊ธฐ ์ํ ๋ฌธ์์ด์ด๋ค. ์๋ฅผ ๋ค์ด์, ๊ฐ ๋ฐ์ดํ
์ name
์ด๋ผ๋ ์ ์ผํ ํ๋๊ฐ ์๋ค๋ฉด, ๋ค์ ์ฒ๋ผ ์ฐ๊ฒฐํ ์ ์๋ค.
.data(data, function(d) { return d.name; })
key ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ ์์ธํ ์์ ๋ A Bar Chart, Part 2 ์์ ๋ฅผ ์ฐธ๊ณ ํ์.
data
์ฐ์ฐ์๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ ๊ฐฑ์ ๋ ์ ํ๋ฌผ(์ ๋ถ๊ฐ ์๋)๋ก์, ์ ํํ DOM ๋ฌธ์์์์ ์ธ์๋ก ๋๊ธด ๋ฐ์ดํฐ์ ์์๋ฅผ ํ ๋นํด์ ๋ฐํํ๋ค. ๊ฐฑ์ ๋ ์ ํ๋ฌผ์๋ ๋ถ์กฑํ(enter) ์ ํ๋ฌผ๊ณผ ๋จ๋(exit) ์ ํ๋ฌผ๋ก์ ์ฐธ์กฐ๋ ์๋ค. ์ด๋ฅผ ํตํด์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก HTML ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, key ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ณ ์กด์ฌํ๋ ์ ํ๋ฌผ์ด ์ง์ ํ ๋ฐ์ดํฐ ๋ณด๋ค ๋ฌธ์์์๊ฐ ์ ๋ค๋ฉด, ๋ถ์กฑํ ์ ํ๋ฌผ์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ํ ํ๋ ์ด์ค ํ๋๋ก ์ฑ์ด๋ค. ๋ง์ฝ ๋ฐ์ดํฐ ๋ณด๋ค ์ ํ๋ฌผ์ ๋ฌธ์์์๊ฐ ๋ ๋ง๋ค๋ฉด, ๋จ๋ ์ ํ๋ฌผ์ ๋จ๋ ๋ฌธ์์์๋ก ์ฑ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํํ ๋ฌธ์์์๊ฐ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๊ฐ์ผ๋ฉด, ๊ฐฑ์ ๋ ์ ํ๋ฌผ์ ๋ชจ๋ ๋
ธ๋๊ฐ ์๊ณ ๋ถ์กฑํ ์ ํ๋ฌผ๊ณผ ๋จ๋ ์ ํ๋ฌผ์ ๋น์ด์๊ฒ ๋๋ค. ์์ธํ ๋ด์ฉ์ ํํ ๋ฆฌ์ผ Thinking With Joins ๋ฅผ ์ฐธ๊ณ ํ๋ผ.
key ํจ์ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด data
์ฐ์ฐ์๋ก ๋
ธ๋ ์์์ ์์ธ(index)๋ ๋ฐ๊ฟ ์ ์๋ค. ์ด ์์ธ์์ ๋ชจ๋ ์ฐ์ฐ ํจ์๊ฐ์ ์ํด์ ํจ์์ ๋๋ฒ์งธ ์ ๋ฌ์ธ์ i
๋ก ์ ๋ฌ๋๋ค. ํ์ง๋ง, ์ด ํจ์๊ฐ ๋ฌธ์์ ์กด์ฌํ๋ DOM ๋ฌธ์์์๋ฅผ ์๋์ผ๋ก ์ฌ๋ฐฐ์ดํ๋๊ฑด ์๋๋ค. ๋ฌธ์๋ด ๋ฌธ์์์์ ์์๋ฅผ ๋ฐ๊ฟ ๋๋ sort๋ order๋ฅผ ์จ์ผํ๋ค.
values ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ด ๋ฉ์๋๋ ์ ํ๋ฌผ์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฃน์ ์ํ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๋ฐํํ๋ค. ๋ฐํ ๋ฐฐ์ด์ ๊ธธ์ด๋ ์ ํ๋ฌผ์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฃน์ ๊ธธ์ด๊ฐ ๋๊ณ ๋ฐํ ๋ฐฐ์ด ๊ฐ ๋ฐ์ดํ ์ ์์ธ์ ๋ถํฉํ๋ ์ ํ๋ฌผ์ ์์ธ๊ณผ ๊ฐ๊ฒ ๋๋ค. ์ด๋, ๋ง์ฝ ์ ํ๋ฌผ์ ๋ฌธ์์์ ์ผ๋ถ๊ฐ null ์ด๊ฑฐ๋ ์ ํ๋ฌผ์ด ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ๋์ด์์ง ์๋ค๋ฉด, ๋ฐฐ์ด์์ ํด๋น ์์ธ์ ์์๋ undefined๊ฐ ๋๋ค.
์ฃผ์์ฌํญ: data
๋ฉ์๋๋ฅผ ์ฌ์ ์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ฆฌ์ด ํ๋ ์ฉ๋๋ก ์ฌ์ฉํ์ง ๋ง๋ผ. ์ด๋๋ selection.datum๋ฅผ ์ฌ์ฉํ๋ค.
# selection.enter()
์ด ๋ฉ์๋๋ ํ์ฌ ์ ํ๋ฌผ์์์ ๋ฐ์ดํฐ์ ๋ถํฉํ๋ ๋งํผ DOM ๋ฌธ์์์๊ฐ ์์ผ๋ฉด ๊ทธ ๊ฐ ๋ฐ์ดํฐ ์์๋ฅผ ์ํ ํ๋์ด์ค ํ๋ ์ญํ์ ํ๋ ๋ถ์กฑํ ์ ํ๋ฌผ ์ ๋ฐํํ๋ค. ์ด ๋ฉ์๋๋ data์ฐ์ฐ์์ ๋ฐํ ์ ํ๋ฌผ์๋ง ์ ์๋์ด์๊ณ , append, insert, select๋ ๊ทธ ๋ถ์กฑํ ์ ํ๋ฌผ์๋ง ์ ์๋์ด์๋ค. ์ด ์ฐ์ฐ์๋ค์ ์ปจํ ์ธ ํธ์ง ์ ์ ๋ถ์กฑํ ๋ ธ๋๋ฅผ ๊ฐ๋ ํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค. (๋ถ์กฑํ ์ ํ๋ฌผ์ด ๋น์๋์ง๋ฅผ ํ์ธํ๊ธฐ์ํ empty๋ ์๋ค.), ์ฃผ์ํ ์ ์ enter ์ฐ์ฐ์๋ ๋ถ์กฑํ ์ ํ๋ฌผ๋ก์ ์ฐธ์กฐ๋ง์ ๋ฐํํ๋ฏ๋ก ์ถ๊ฐํ ๋ ธ๋๋ ์ง์ ์ถ๊ฐํด์ผ ํ๋ค๋ ์ฌ์ค์ด๋ค.
๊ฐ๋จํ ์๋ฅผ ๋ค๋ฉด, ์ ํ์ ํ๋๋ฐ ์ ํ๋ฌผ์ด ๋น์ฌ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ ๋ฐ์ดํฐ์ ๋งค์นญ๋๋๋ก ์๋ก์ด ๋ ธ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ๋ ๊ฒฝ์ฐ๋ค.
d3.select("body").selectAll("div")
.data([4, 8, 15, 16, 23, 42])
.enter().append("div")
.text(function(d) { return d; });
๋ฌธ์์ body
๊ฐ ๋น ์ฑ๋ก ์์ฑ๋์๋ค๋ ๊ฐ์ ํ์, ์์ ์ฝ๋๋ 6๊ฐ์ DIV ๋ฌธ์์์๋ฅผ ์๋ก ์์ฑํ๊ณ ์์๋๋ก body
์ ์ถ๊ฐํ๋ค. ๊ทธ๋ฐ ๋ค์ DIV์ ํ
์คํธ ์ปจํ
์ธ ๋ฅผ ๋งคํ๋ ๋ฐ์ดํฐ ์ซ์๋ก ์ฑ์ด๋ค.
<div>4</div>
<div>8</div>
<div>15</div>
<div>16</div>
<div>23</div>
<div>42</div>
enter
๋ฉ์๋์ ๋ฐํ๊ฐ ํ๋ ์ด์ค ํ๋ ๋
ธ๋์ ๋ํด ํ๊ฐ์ง ๋ ์ง์ ๋ด์ฉ์ ์ด ๋
ธ๋๋ค์ด ๋ถ๋ชจ ๋
ธ๋์ ์์นํ๋ค๋ ์ฌ์ค์ด๋ค. ๊ทธ๋ฌ๋ enter
๋ฉ์๋์ ๋ฐํ ๋
ธ๋๋ append์ insert๋ง ์ง์ํ๋ค.
append์ insert ๋ฉ์๋๋ ๋ถ์กฑํ ์ ํ๋ฌผ ๋ฅผ ๊ฐฑ์ ๋ ์ ํ๋ฌผ๊ณผ ํฉ์ณ์ง๋ค. ์ด๋ ๋ถ์กฑํ ์ ํ๋ฌผ๊ณผ ๊ฐฑ์ ๋ ์ ํ๋ฌผ์ ๋ฐ๋ก๋ฐ๋ก ์ฐ์์๋ค์ ์ ์ฉํ๋ ๊ฒ์ ๋นํด์ ๋ ๊ฐ์ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค. ๋ถ์กฑํ ๋ ธ๋์ ํ๋์ด์ค ํ๋๋ฅผ ๊ฐ์ ธ์จ ํ์ ๋ฐ๋ก ์ด๋ฅผ ๊ฐฑ์ ํ ์ ํ๋ฌผ์ ์ ์ฉํ ์ ์์ง๋ง, ํํ ๊ฒฝ์ฐ๋ ์๋์ง๋ง ๊ฐฑ์ ํ ์ ํ๋ฌผ์์๋ง ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์๋ ๋ถ์กฑํ ๋ ธ๋๋ฅผ ์๋ก ๊ฐ์ ธ์ค๊ธฐ ์ ์ ๊ฐฑ์ ํ ์ ํ๋ฌผ์์ ํ์ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
# selection.exit()
์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ ์์์ ์๋ณด๋ค ํ์ฌ ์ ํ๋ฌผ์ DOM ๋ฌธ์์์๊ฐ ๋ง์ ๊ฒฝ์ฐ ๊ทธ ๋จ๋ ์ ํ๋ฌผ ์ ๋ฐํํ๋ค. ์ด ๋ฉ์๋๋ data ์ฐ์ฐ์์ ๋ฐํ ์ ํ๋ฌผ์๋ง ์ ์๋์ด์๋ค. ์ผ๋ฐ์ ์ผ๋ก remove๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๊ธด ํ์ง๋ง ๋จ๋ ์ ํ๋ฌผ ์๋ ๋ถ์กฑํ ์ ํ๋ฌผ ๊ณผ ๋ฌ๋ฆฌ ๋ชจ๋ ์ฐ์ฐ์๊ฐ ์ ์๋์ด์๋ค. ๋ค๋ฅธ ์ฐ์ฐ์๋ค์ด ์์ผ๋ฏ๋ก ์ํ๋ ์๊ฐ ์ ํ(transition)์ ๋๋ผ ์ ์๋ค. ์ฃผ์ํ ์ ์ exit ์ฐ์ฐ์๋ ๋จ๋ ์ ํ๋ฌผ ๋ก์ ์ฐธ์กฐ๋ง์ ๋ฐํํ๋ฏ๋ก ๋ ธ๋ ์ ๊ฑฐ๋ ์ฌ๋ฌ๋ถ์ ๋ชซ์ด๋ค.
๊ฐ๋จํ ์๋ฅผ ๋ค์ด๋ณด๋ฉด, enter ์ฐ์ฐ์๋ฅผ ์ํ ์์ ์์ ์์ ์์ฑ๋ 6๊ฐ์ DIV ๋ฌธ์์์๋ฅผ ๊ฐฑ์ ํ๋ ๋ฌธ์ ๋ํด ์๊ฐํด๋ณด์. ์ด์ ๊ฐ์ ๋ช๊ฐ๋ง ๋ฐ๊พผ ์๋ก์ด ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์ด ๋ฌธ์์์์ ๊ฒฐํฉํ๋ค.
var div = d3.select("body").selectAll("div")
.data([1, 2, 4, 8, 16, 32], function(d) { return d; });
๊ทธ๋ฌ๋ฉด data ์ฐ์ฐ์ ํธ์ถ ๊ฒฐ๊ณผ์ธ ๋ณ์ div
๋ ๊ฐฑ์ ํ ์ ํ๋ฌผ ์ ์ฐธ์กฐํ๋ค. ์์ ๊ฐ ํญ๋ฑํจ์์ธ key ํจ์๋ฅผ ์ง์ ํ๊ณ ์๋ก์ด ๋ฐ์ดํฐ ๋ฐฐ์ด์ด ์ด์ ๋ฐ์ดํฐ ๋ฐฐ์ด์๋ ์๋ [4, 8, 16]์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฐฑ์ ํ ์ ํ๋ฌผ ์ ์ธ๊ฐ์ DIV ๋ฌธ์์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด์ ์ด์ ๋ฐ์ดํฐ์์ ๋จ์ ์์๋ฅผ ์ด์ผ๊ธฐํด๋ณด์. ๋ถ์กฑํ ์ ํ๋ฌผ ์ ์ฌ์ฉํด์ [1, 2, 32] ์ ๊ท ์์๋ฅผ ์ธ์คํด๋ํด์ ์ถ๊ฐํ ์ ์๋ค.
div.enter().append("div")
.text(function(d) { return d; });
์๋๋ฉด ๋จ์ ์์ [15, 23, 42]๋ฅผ ์ ๊ฑฐํ ์์๋ค.
div.exit().remove();
๊ทธ๋ฌ๋ฉด ๋ฌธ์์ body๋ ๋ค์์ฒ๋ผ ๋ณด์ธ๋ค.
<div>4</div>
<div>8</div>
<div>16</div>
<div>1</div>
<div>2</div>
<div>32</div>
DOM ๋ฌธ์์์๊ฐ ์์๊ฐ ์๋ง์ธ๊ฒ ๋ฌธ์ ์ธ๋ฐ, ์ ํ๋ฌผ ์์ธ i
๋ (์ฐ์ฐ์ ํจ์์ ๋๋ฒ์งธ ์ธ์) ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์์ธ๊ณผ ์ผ์นํ๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฅผ index ์์ฑ์ผ๋ก ํ ๋นํ ์ ์๋ค.
d3.selectAll("div").attr("index", function(d, i) { return i; });
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
<div index="2">4</div>
<div index="3">8</div>
<div index="4">16</div>
<div index="0">1</div>
<div index="1">2</div>
<div index="5">32</div>
๋ฐ์ดํฐ ์์์ ์ผ์นํ๋ ๋ฌธ์ ์์ ์์๋ฅผ ์ํ๋ค๋ฉด sort, order๋ฅผ ์ฌ์ฉํ๋ค.
# selection.filter(selector)
์ ํ๋ฌผ์ ํํฐ๋งํ๋ค. ์ฆ, ์ธ์ selector ๊ฐ true์ ๋ํญํ๋ ๋ฌธ์์์๋ง ๋ด๊ณ ์๋ ์ ํ๋ฌผ์ ์๋ก ๋ฐํํ๋ค. selector ๋ ํจ์์ด๊ฑฐ๋ ".foo"๊ฐ์ CSS ์
๋ ํฐ ๋ฌธ์์ด์ด๋ค. ๋ค๋ฅธ ์ฐ์ฐ์๋ค ์ฒ๋ผ, ์ด ํจ์๋ ๋ฐ์ดํ
d
์ ์์ธ๊ฐ i
๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๊ณ , ํด๋น DOM ๋ฌธ์์์๋ฅผ ์ปจํ
์คํธ this
๋ก ๊ฐ์ง๋ค. ๋ฐฐ์ด์ ๋ด์ฅ ๋ฉ์๋ filter์ฒ๋ผ, ์๋ ์ ํ๋ฌผ์ ์์ธ๊ฐ์ ์ ์งํ์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์์์๋ฅผ ์ ๊ฑฐํ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ค. ์์ธ๊ฐ์ ์ ์งํ๊ณ ์ถ๋ค๋ฉด select๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ํ์ ๋ฒ์งธ๋ง ๋ชจ๋ ์ ํํ๋ ค๋ฉด,
var odds = selection.select(function(d, i) { return i & 1 ? this : null; });
๊ฐ์ ์์ ์ filter ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด,
var odds = selection.filter(function(d, i) { return i & 1; });
ํน์ CSS ์ ๋ ํฐ๋ฅผ ์ฌ์ฉํ๋ฉด,
var odds = selection.filter(":nth-child(odd)");
๊ทธ๋ฌ๋ฏ๋ก ๋ฌธ์์์์ ๋ถ๋ถ์งํฉ์ ์ ์ฉํ๊ธฐ์ํด์๋ select๋ filter ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
# selection.datum([value])
์ ํ๋ ๊ฐ๋ณ ๋ฌธ์์์์ ์ฎ์ธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๊ฑฐ๋ ๊ฐ์ ธ์จ๋ค. selection.data ๋ฉ์๋์๋ ๋ค๋ฅด๋ค. ์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ ๊ฒฐํฉ ์ฐ์ฐ์ ํ์ง ์๋๋ค. (๊ทธ๋ฌ๋ฏ๋ก ๋ชจ์๋ ์ ํ๋ฌผ๊ณผ ๋จ๋ ์ ํ๋ฌผ ์ฐ์ฐ๋ ์ํ๋ค.) ์ด ๋ฉ์๋๋ selection.property ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์๋ค.
d3.selection.prototype.datum = function(value) {
return arguments.length < 1
? this.property("__data__")
: this.property("__data__", value);
};
value ์ธ์๋ฅผ ๋๊ธฐ๋ฉด ๊ทธ ๊ฐ์ผ๋ก ๋ชจ๋ ์ ํ ๋ฌธ์์์์์ ์ฎ์ธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๊ฐ ๊ฐ์ ๊ฐ์ด ์ฃผ์ด์ง์ง๋ง, value ๊ฐ ํจ์๋ฉด ๊ทธ ํจ์๋ ๊ฐ ์ ํ ๋ฌธ์์์๋ณ๋ก ํธ์ถ๋๊ณ , ์ด์ ๋ฐ์ดํ
d
์ ํ์ฌ ์์ธ๊ฐ i
์ ์ธ์๋ก ๊ฐ์ง๋ฉฐ ํด๋น DOM ๋ฌธ์์์๋ฅผ ์ปจํ
์คํธ this
๋ก ๊ฐ์ง๋ค. ์ด ํจ์๋ ๊ฐ ๋ฌธ์์์์ ๋ฐ์ดํฐ ์ง์ ์ ์ฌ์ฉ๋๋ค. value ๊ฐ null์ด๋ฉด ์ฎ์ธ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค. ์ด ์ฐ์ฐ์๋ ์์ธ๊ฐ์ ์ํฅ์ ์ฃผ์ง๋ ์๋๋ค.
value ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์์ ์ฎ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ ํ๋ฌผ์ด ๋ช ํํ๊ฒ ํ๋์ ๋ฌธ์์์๋ง ๊ฐ์ง๊ณ ์๋ค๋ ์ฌ์ค์ ์๋๋ง ์ ์ฉํ๋ค.
์ฃผ์: ์ด ๋ฉ์๋์ ์ด์ ์ด๋ฆ์ "map"์ด ์๋ค. "map"์ ํ๊ธฐ๋์๋ค.
datum
๋ฉ์๋๋ D3๋ก HTML5์ custom data ์์ฑ์ ์ ๊ทผํ ๋ ์ ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ฐ์ ๋ฌธ์์์๊ฐ ์๋ค.
<ul id="list">
<li data-username="shawnbot">Shawn Allen</li>
<li data-username="mbostock">Mike Bostock</li>
</ul>
์ฌ๋ฌ๋ถ์ HTML5 ๋ด์ฅ ํ๋กํผํฐ dataset๋ก ๊ฐ ๋ฌธ์์์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํด์ D3๋ก custom data ์์ฑ์ ๋์ด์ฌ ์ ์๋ค.
selection.datum(function() { return this.dataset; })
์๋ฅผ ๋ค์ด, username์ผ๋ก ๋ฌธ์์์๋ฅผ ์ ๋ ฌํ ๋ ์ฌ์ฉํ ์ ์๋ค.
# selection.sort(comparator)
์ธ์๋ก ์ง์ ํ ๋น๊ต ํจ์ comparator ์ ๋ฐ๋ผ์ ํ์ฌ ์ ํ๋ฌผ์ ์ ๋ ฌํ๋ค. ๋น๊ต ํจ์๋ ๋น๊ตํ ๋ฐ์ดํฐ ์์ a ์ b ๋ฅผ ์ธ์๋ก ๊ฐ๋๋ค. ๋ฐํ ๊ฐ์ ์์, ์์, 0 ์ค ํ๋๋ค. ๋ฐํ๊ฐ์ด ์์๋ฉด a ๊ฐ b ๋ณด๋ค ์์ ์จ๋ค. ๋ฐํ ๊ฐ์ด ์์๋ฉด a ๋ b ๋ณด๋ค ๋ค์ ์จ๋ค. ๊ทธ๋ ์ง์์ผ๋ฉด a ๊ณผ b ๊ฐ ๊ฐ๋ค๊ณ ๋ณด๊ณ ์์๋ ์์๋ก ์ ํ๋ค. sort๋ ์์ง ์์ ํ ๋ฒ์ ์ด ์๋์ง๋ง ์ด๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐฐ์ด์ ๋ด์ฅ ๋ฉ์๋ sort์ ๋์ผ ๋์์ ๋ณด์ฅํ๋ค.
# selection.order()
๋ฌธ์ ์์๊ฐ ์ ํ๋ฌผ ์์์ ์ผ์นํ ๋๋ก ๋ฌธ์์ ๋ฌธ์์์๋ฅผ ๋ค์ ์ฝ์ ํ๋ค. ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์ ๋ ฌ ๋์ด์๋ค๋ฉด sort()๋ฅผ ํธ์ถํ๋ ๊ฒ ๊ณผ ๊ฐ์ง๋ง ๋ ๋น ๋ฅด๋ค.
# selection.on(type[, listener[, capture]])
ํ์ฌ ์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์์ ์ธ์๋ก ์ง์ ํ ํ์
(type) ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋(listener) ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ค. type ์ "click", "mouseover", "submit" ๊ฐ์ ์ด๋ฒคํธ ํ์
์ ์ด๋ฆ์ ์๋ฏธํ๋ ๋ฌธ์์ด์ด๋ค. ์ธ์๋ก ๋๊ธด listener ๋ ๊ฐ๊ฐ์ DOM ๋ฌธ์์์์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณ๋์ ์ฐ์ฐ ํจ์์ฒ๋ผ ํธ์ถ๋๋ค. ์ด ํจ์๋ ๋ฐ์ดํ
d
์ ์์ธ i
์ ์ธ์๋ก ๊ฐ์ง๋ฉฐ, ํด๋น DOM ๋ฌธ์์์๊ฐ this
๊ฐ ๋๋ค. ๋ฆฌ์ค๋์์ ํ์ฌ ์ด๋ฒคํธ์ ์ ๊ทผํ ๋๋ ์ ์ญ ๊ฐ์ฒด์ธ d3.event๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฐํ ๊ฐ์ ๋ฌด์๋๋ค.
์ ํํ ๋ฌธ์์์์ ๋ฑ๋กํ๋ ค๋ ์ด๋ฒคํธ ํ์ ์ ๋ฆฌ์ค๋๊ฐ ์ด๋ฏธ ๋ฑ๋ก๋์ด ์๋ค๋ฉด, ์ด์ ๋ฆฌ์ค๋๋ ์ ๊ท ๋ฆฌ์ค๋๊ฐ ์ถ๊ฐ๋๊ธฐ ์ ์ ์ญ์ ๋๋ค. ๋์ผ ํ์ ์ ์ฌ๋ฌ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๋ ค๋ฉด "click.foo"๋ "click.bar"๊ฐ์ ๋ค์์คํ์ด์ค๋ฅผ ์ต์ ์ผ๋ก ๋ฃ์ด์ผ ํ๋ค.
๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ ๋๋ listener ์ธ์์ null๋ฅผ ๋๊ธด๋ค. ์ด๋ค ์ด๋ฒคํธ ํ์
์์ ๋ชจ๋ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด listener์๋ null์, type์๋ .type
๋ฅผ ๋๊ธด๋ค. ์) selection.on(".foo", null)
W3C์ useCapture ํ๋๊ทธ์ ํด๋นํ๋ capture ํ๋๊ทธ๋ฅผ ์ง์ ํ ์ ์๋ค. useCapture ํ๋๊ทธ ๋ ๊ณ์ธต๊ตฌ์กฐ์ ํ๋จ์ ์๋ EventTarget์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๊ธฐ ์ ์ ๋ฑ๋ก๋ EventListener๋ก ๋จผ์ ์ ํ๋๋ค. ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํตํด์ ๋ฒ๋ธ๋ง ๋๋ ์ด๋ฒคํธ๋ capture๋ฅผ ์ฌ์ฉํด์ ์ง๋ช ํ EventListener๋ฅผ ํธ์ถํ์ง ์๋๋ค.
listener ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ผ๋ฉด ์ง์ ํ type ์ ์ํด ํ์ฌ ํ ๋น๋ ์ด๋ฒคํธ๊ฐ ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฐํํ๋ค.
# d3.event
๋ง์ฝ ํ์ฌ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์๋ค๋ฉด ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ค. ์ด ์ ์ญ ๊ฐ์ฒด์๋ on ์ฐ์ฐ์๋ก ๋ฑ๋ก๋ ์ด๋ฒคํธ ๋ฆฌ์คํฐ ์ฝ๋ฐฑํจ์๊ฐ ์๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ง์ง๋ง ๋ธ๋ญ์์ ํต๋ณด๋ ํ์ ํด๋น ์ด๋ฒคํธ๋ ์ด๊ธฐํ๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์ค๋ ํจ์๋ ๋ค๋ฅธ ์ฐ์ฐ์ ํจ์์์ ๊ฐ์ ํํ(๋ฐ์ดํฐ d
๊ณผ ์์ธ i
๋ฅผ ์ธ์๋ก ๊ฐ๋)๋ฅผ ์ ์งํ ์ ์๋ค.
d3.event
๊ฐ์ฒด๋ DOM event๋ก์ preventDefault()
์ stopPropagation()
๊ฐ์ ๋ฉ์๋๋ ๋ฌผ๋ก ์ด๊ณ timeStampe
์ keyCode
๊ฐ์ ํ์ค ์ด๋ฒคํธ ํ๋๊น์ง ๊ตฌํํ๋ค. ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ์ธ pageX, pageY๋ฅผ ์ฌ์ฉํ ๋, d3.event
๋ ์ด๋ฒคํธ ์ขํ๊ฐ์ ํด๋น ์ด๋ฒคํธ์ ์ปจํ
์ด๋ ๋ด๋ถ ์์คํ
์ขํ๋ก ๋ณํ์ ๋์์ ์ค๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์์์ SVG๊ฐ ์๋ค๋ฉด SVG ์ด๋ฏธ์ง ์ข์ธก ์๋จ ๊ธฐ์ค์ ์ด๋ฒคํธ ์ขํ๊ฐ ํ์ํ๊ณ , SVG ์ปจํ
์ด๋์ ๋ณํ(transform)์ด ์ผ์ด๋ฌ๋ค๋ฉด ํด๋น ๋ณํ์ ๋ฐ์๋ ์ด๋ฒคํธ ์ขํ๋ ํ์ํ๋ค. ๊ธฐ๋ณธ์ ์ธ ๋ง์ฐ์ค ์ขํ๋ d3.mouse์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ , iOS ๋ฉํฐํฐ์น์ ์ขํ๋ d3.touches๋ฅผ ์ฌ์ฉํ๋ผ.
# d3.mouse(container)
์ธ์๋ก ๋๊ธด container ๊ธฐ์ค์ผ๋ก ํด๋น d3.event์ x, y ์ขํ๊ฐ์ ๋ฐ๊พผ๋ค. container ๋ svg:g๋ svg:svg๊ฐ์ HTML, SVG ์ปจํ ์ด๋ ๋ฌธ์์์๊ฐ ๋๋ค. ์ขํ๊ฐ์ผ๋ก ์์๊ฐ ๋๊ฐ์ธ [ x, y ] ๋ฐฐ์ด์ ๋ฐํํ๋ค.
# d3.touches(container)
์ธ์๋ก ๋๊ธด container ๊ธฐ์ค์ผ๋ก touches ์์ฑ ๊ธฐ๋ฐ์ ํด๋น d3.event์ x, y ์ขํ๊ฐ์ ๋ฐ๊พผ๋ค. container ๋ svg:g, svg:svg๊ฐ์ HTML, SVG ์ปจํ ์ด๋ ๋ฌธ์์์๊ฐ ๋๋ค. ์ขํ๊ฐ์ผ๋ก ์์๊ฐ ๋๊ฐ์ธ ๋ฐฐ์ด์ ๋ฐฐ์ด [ [ x1 , y1], [ x2 , y2], โฆ ]๋ฅผ ๋ฐํํ๋ค.
# selection.transition()
ํด๋น ์ ํ๋ฌผ๋ฅผ ์ํ transition ๋ฅผ ์์ํ๋ค. ๋ฐ๋ก ๋ฐ์๋์ง ์๊ณ ๋ถ๋๋ฝ๊ฒ ์๊ฐ์ ๋๊ณ ์ ๋๋ฉ์ด์ ์ ์ผ์ผํค๋ ์ฐ์ฐ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ณํ(Transition)์ ๋๋ถ๋ถ ์ ํ๋ฌผ(selection)์ฒ๋ผ ๋์ํ๋ค. ์ด๋ค.
์ต์์ ๋ ๋ฒจ์ ์ ํ ๋ฉ์๋๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋์์ผ๋ก ์กฐํ๋ฅผ ํ๋ ๋ฐ๋ฉด์ ์ ํ๋ฌผ์ select๊ณผ selectAll ์ฐ์ฐ์๋ ๊ฐ ์ ํ๋ ๋ฌธ์์์์ ์์์์์์ ์กฐํ๋ฅผ ํ๋ค. D3๋ ์ด๋ฅผ "ํ์์ ํ๋ฌผ"์ด๋ผ ๋ถ๋ฅธ๋ค. ์๋ฅผ ๋ค์ด, d3.selectAll("p").select("b")
๋ ๋ชจ๋ ๋จ๋ฝ("p") ๋ฌธ์์์์์ ์ฒซ๋ฒ์งธ ๋ณผ๋("b") ๋ฌธ์์์๋ฅผ ๋ฐํํ๋ค. selectAll๋ฅผ ํตํ ํ์์ ํ๋ฌผ ์ ํ์ ์กฐ์์์์์ ๋ฌธ์์์๋ฅผ ๊ทธ๋ฃน์ง๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, d3.selectAll("p").selectAll("b")
์ d3.selectAll("p b")
๊ฐ ๋ฐํํ ํ๋ฉด์ ์ธ ์ ํ๋ฌผ์ ๋จ๋ฝ("p")๋ฌธ์์์๋ก ๊ทธ๋ฃน์ง๋๋ค. select๋ฅผ ํตํ ํ์ ์ ํ๋ฌผ ์ ํ๋ ๋น์ทํ์ง๋ง ๊ทธ๋ฃน์ ์ ์งํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ค. ๊ทธ๋ฃน์ ๋ฐ์ดํฐ ์ฐ๊ฒฐ์์ ์ค์ํ ๊ท์น์ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ํ ์ฐ์ฐ์๋ ๊ทธ๋ฃน์์์ ํด๋น ๋ฌธ์์์์ ์ซ์ํ ์์ธ์ ์์กดํ๋ค.
# selection.select(selector)
ํด๋น ์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์์์ ์ธ์๋ก ๋๊ธด selector ๋ฌธ์์ด๊ณผ ๋ถํฉ๋๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์์์๋ฅผ ์ ํํ๋ค. ํด๋น ์ ํ๋ฌผ์ ์ง์ ํ ์ ๋ ํฐ์ ํด๋นํ๋ ๋ฌธ์์์๊ฐ ์๋ค๋ฉด ๋ฐํ ์ ํ๋ฌผ์์ ํด๋น ์์ธ์ ์์๋ null์ด๋ค. D3์ ์ฐ์ฐ์((data๋ ์์ธ)๋ null ์์๋ฅผ ์๋์ผ๋ก ๋ฌด์ํ๋ค. ์ด๋๋ถ์ ์กด์ฌํ๋ ์ ํ๋ฌผ์ ์์ธ์ด ์ ์ง๋๋ค.ํด๋น ๋ฌธ์์์์ ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ ๋ฐํ๋๋ ํ์์ ํ๋ฌผ์ ์์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก ์ ํ๋ ๋ฌธ์์์์ ์ฎ์ธ๋ค. ์ ๋ ํฐ์ ํด๋นํ๋ ๋ฌธ์์์๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด ๋ฌธ์์์์ ์ฒซ๋ฒ์งธ๋ก ์ผ์นํ๋ ๋ฌธ์์์๋ง ์ ํ๋๋ค.
selector ๋ ๋ฌธ์์์๋ null๋ฅผ ๋ฐํํ๋ ํจ์๊ฐ ๋ ์๋ ์๋ค. null์ ์ผ์นํ๋ ๋ฌธ์์์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ค. ํจ์ selector ๋ ์ ๋ฌ์ธ์๋ก ํด๋น ๋ฐ์ดํ
d
, ์์ธ๊ฐ i
๋ฅผ ๊ฐ๊ณ this
๊ฐ ํด๋น DOM ๋ฌธ์์์๋ก์ ๋ค๋ฅธ ์ฐ์ฐ์ ํจ์์ ๋์ผํ ํํ๋ก ํธ์ถ๋๋ค.
# selection.selectAll(selector)
ํด๋น ์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์์ ๋ํด์ ์ ๋ฌ์ธ์ selector ๋ฌธ์์ด์ ๋ถํฉํ๋ ์์ ๋ฌธ์์์ ๋ชจ๋๋ฅผ ์ ํํ๋ค. ๋ฐํ ์ ํ๋ฌผ์ ํด์ ์ ํ๋ฌผ์ ์กฐ์ ๋
ธ๋๋ก ๊ทธ๋ฃนํ ๋๋ค. ๋ง์ฝ ํด๋น ์ ํ๋ฌผ์ ์ง์ ํ ์
๋ ํฐ์ ๋ถํฉํ๋ ๋ฌธ์์์๊ฐ ์๋ค๋ฉด ๋ฐํ ์ ํ๋ฌผ์ ํด๋น ์์ธ ๊ทธ๋ฃน์ ํ
๋น๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐํ ๊ฐ์ธ ํ์์ ํ๋ฌผ์ ํด๋น ์ ํ๋ฌผ์์ ๋ฐ์ดํฐ๋ฅผ ์์ํ์ง ์๋๋ค. data ๊ฐ์ ํจ์๋ก ์ ๋ฌํ๋ค๋ฉด ๊ทธ ํจ์๋ ์กฐ์ ๋
ธ๋์ ๋ฐ์ดํฐ d
์ ๊ทธ๋ฃน ์์ธ๊ฐ i
์ ๊ธฐ๋ฐํด์ผ ํ๋ค.
selectAll๋ฅผ ์ฌ์ฉํ ๊ทธ๋ฃนํ์ ์ถ๊ฐ ์ ๋ ฅ๋๋ ๋ชจ์๋ ํ๋ ์ด์ค ํ๋ ๋ ธ๋์๋ ์ํฅ์ ์ค๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ชจ์๋ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ๋ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ง์ ํ๊ธฐ์ํด์ ์๋์ฒ๋ผ selectAll๋ฅผ ์ฌ์ฉํ๋ค.
d3.select("body").selectAll("div")
๊ฐ ๊ทธ๋ฃนํ ๋ฐฐ์ด์ parentNode
ํ๋กํผํฐ๋ก ๊ฐ ๊ทธ๋ฃนํ์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ๋ณผ ์ ์๋ค. selecton[0].parentNode
์ฒ๋ผ ์ฌ์ฉํ๋ค.
์ ๋ฌ์ธ์ selector ๋ ๋ฌธ์์์๋ NodeList ๋ฐฐ์ด์ ๋ฐํํ๋ ํจ์๋ ๊ฐ๋ฅํ๋ค. ๋ถํฉํ๋ ๋ฌธ์์์๊ฐ ์๋ค๋ฉด ๋น ๋ฐฐ์ด๋ฅผ ๋ฐํํด๋ ๋๋ค. ํจ์ selector ๋ ์ ๋ฌ์ธ์๋ก ํด๋น ๋ฐ์ดํ
d
, ์์ธ๊ฐ i
๋ฅผ ๊ฐ๊ณ this
๊ฐ ํด๋น DOM ๋ฌธ์์์๋ก์ ๋ค๋ฅธ ์ฐ์ฐ์ ํจ์์ ๋์ผํ ํํ๋ก ํธ์ถ๋๋ค.
For advanced usage, D3 has a few additional operators for custom control flow.
D3๋ ์ฌ์ฉํธ์๋ฅผ ์ํด์ ํ๋ฆ์ ์ด๋ฅผ ์ํ ๋ช๊ฐ์ง ํ์ฅ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ค.
# selection.each(function)
ํด๋น ์ ํ๋ฌผ์ ๊ฐ ๋ฌธ์์์ ๋ณ๋ก ์ ๋ฌ์ธ์ function ๋ฅผ ํธ์ถํ๋ค. ์ด ํจ์์ ์ ๋ฌ์ธ์๋ ๋ฐ์ดํ
d
์ ์์ธ๊ฐ i
์ด๊ณ this
๋ ํด๋น DOM ๋ฌธ์์์์ด๋ค. ์ด ์ฐ์ฐ์๋ ๊ฑฐ์ ๋ชจ๋ ์ฐ์ฐ์ ๋ด๋ถ์์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, ์ ํ๋ ๋ฌธ์์์๋ณ๋ก ์์์ ์ฝ๋๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํ ์ ์๋ค. ์ฝ๋ฐฑ ํจ์์์ d3.select(this)
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์ฐ์ฐ์๊ฐ ์ฌ๊ท์ ์ผ๋ก ์ ํ๋ฌผ์ ์ฒ๋ฆฌํ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
# selection.call(function[, argumentsโฆ])
arguments ๋ฅผ ๊ฐ์ง function ๋ฅผ ํด๋น ์ ํ๋ฌผ์์ ํธ์ถํ๋ค. call ์ฐ์ฐ์๋ function ํจ์์ ๋ฐํ ๊ฐ์ ๊ด๊ณ์์ด ํญ์ ํด๋น ์ ํ๋ฌผ์ ๋ฐํํ๋ค. call ์ฐ์ฐ์๋ ์๋์ผ๋ก ํจ์ ํธ์ถํ๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง ๋ฉ์๋ ์ฒด์ธ์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ฝ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๊ณณ์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ์ ์ง์ ํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ์ฝ๋๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ๋ง๋ ๋ค.
function foo(selection) {
selection
.attr("name1", "value1")
.attr("name2", "value2");
}
์ด์ ์ด ํจ์๋ฅผ ํธ์ถํ ์๋ ์๊ณ ,
foo(d3.selectAll("div"))
๋์ผํ๊ฒ ์ด๋ ๊ฒ ํด๋ ๋๋ค.
d3.selectAll("div").call(foo);
ํธ์ถ๋ ํจ์์ this
์ปจํ
์คํธ๋ ํด๋น ์ ํ๋ฌผ์ด๋ค. ์ด ์ฐ์ฐ์์ ์ฒซ ๋ฒ์งธ ์ ๋ฌ์ธ์๋ ๋ถํ์ํ ๋ฉด์ด ์ข ์์ด์ ์ฐจํ์ ๊ฐ์ ๋ ์ง๋ ๋ชจ๋ฅธ๋ค.
# selection.empty()
ํด๋น ์ ํ๋ฌผ์ด ๋น์ด์์ผ๋ฉด true๋ฅผ ๋ฐํํ๋ค. null์ด ์๋ ๋ฌธ์์์๋ฅผ ํฌํจํ์ง ์์ผ๋ฉด ๊ทธ ์ ํ๋ฌผ์ ๋น์ด์๋ค๊ณ ๋ณธ๋ค.
# selection.node()
ํด๋น ์ ํ๋ฌผ์์ null์ด ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์์๋ฅผ ๋ฐํํ๋ค. ์ ํ๋ฌผ์ด ๋น์ด์์ผ๋ฉด null๋ฅผ ๋ฐํํ๋ค.
# d3.selection()
์ต์์(root) ์ ํ๋ฌผ์ ๋ฐํํ๋ค. d3.select(document.documentElement)
์ ๊ฐ๋ค. ๊ฐ์ฒด๊ฐ ์ ํ๋ฌผ์ธ์ง(o instanceof d3.selection
)๋ฅผ ํ์ธํ ๋ ์ด ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ํ ์ ํ๋ฌผ์ prototype์ผ๋ก ์ ๊ท ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉํ ์๋ ์๋ค. ์๋ฅผ๋ค์ด, ์ฒดํฌ๋ฐ์ค์ "checked" ํ๋กํผํฐ๋ฅผ ํธํ๊ฒ ์ค์ ํ๊ธฐ์ํ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ๋ค์์ฒ๋ผ ์์ฑํ ์ ์๋ค.
d3.selection.prototype.checked = function(value) {
return arguments.length < 1
? this.property("checked")
: this.property("checked", value);
};