[javascript] 自分メモ

このメモは、個人的メモ書きで技術的裏付けは薄いです。

createElement 後の getElementById

dom = document.createElement('div')
dom.id = 'hoge'としても

dom.getElementById('hoge')とgetElementsByNameはできない。
ただし、getElementsByTagName は問題ない。
そのためgetElementsByTagName('*')としてやることにより、すべての要素の配列が取得できる。

innerHTMLの落とし穴

innerHTMLは間違った要素や文法のHTMLが入ると自動的にそれらが削除される。
そのため、tableなどで

dom = document.createElement('tr')
dom.innerHTML = '<td>hoge</td><td>piyo</td>'
table.appendChild(dom)

なんてことはできない。
出来ても、domの中身にはhogepiyoしかない

上記のことがしたければ

dom = document.createElement('tr')
dom2 = document.createElement('td')
dom2.textContent = 'hoge'
dom3 = document.createElement('td')
dom2.textContent = 'piyo'
dom.appendChild(dom2)
dom.appendChild(dom3)
table.appendChild(dom.row[0])

しかない。しかし、これではinnerHTMLが使えないので、この方法でもOK。

dom = document.createElement('table')
dom.innerHTML = '<tr><td>hoge</td><td>piyo</td></tr>'
table.appendChild(dom.rows[0])   // rowsはテーブルでtrに直接アクセスするtableコレクション

tableのセルやtr, tdへのアクセス

tableのセルへのアクセスは見た目以上にめんどくさい。

<table><tr><td></td></tr></table>

となっていても、DOMアクセスすると

<table><tbody><tr><td></td><tr></tbody></table>

となりtbodyが余計につく。

なのでテーブルのセルにアクセスするには以下のような方法がある
1. trにアクセス

table.rows[0]  // 1つ目のtr
table.rows[1]  // 2つ目のtr

2. tdにアクセス

table.rows[0].cells[0]  //1つめのtrの中の1つ目のtd
table.rows[0].cells[1]  //1つめのtrの中の2つ目のtd

3. tbodyにアクセス

table.lastChild 

table.firstChildやtable.childNode[0]だと \nなどの改行コードが入っていることがある。

DOMの持つメソッド・プロパティを調べる。

取得したDOMやcreateElementで作ったDOMがどんなメソッドやプロパティを持っているかはkeys()を使うとよい

dom = document.createElement('div')
keys(dom).sort()

["ATTRIBUTE_NODE", "CDATA_SECTION_NODE", "COMMENT_NODE", 
"DOCUMENT_FRAGMENT_NODE", "DOCUMENT_NODE", "DOCUMENT_POSITION_CONTAINED_BY", 
"DOCUMENT_POSITION_CONTAINS", "DOCUMENT_POSITION_DISCONNECTED", 
"DOCUMENT_POSITION_FOLLOWING", "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", 
"DOCUMENT_POSITION_PRECEDING", "DOCUMENT_TYPE_NODE", "ELEMENT_NODE", 
"ENTITY_NODE", "ENTITY_REFERENCE_NODE", "NOTATION_NODE", 
"PROCESSING_INSTRUCTION_NODE", "TEXT_NODE", "addEventListener", "align", 
"appendChild", "attributes", "baseURI", "blur", "childNodes", "className", 
"clientHeight", "clientWidth", "cloneNode", "compareDocumentPosition", "dir", 
"dispatchEvent", "firstChild", "focus", "getAttribute", "getAttributeNS", 
"getAttributeNode", "getAttributeNodeNS", "getElementsByTagName", 
"getElementsByTagNameNS", "getFeature", "getUserData", "hasAttribute", 
"hasAttributeNS", "hasAttributes", "hasChildNodes", "id", "innerHTML", 
"insertBefore", "isDefaultNamespace", "isEqualNode", "isSameNode", "isSupported", 
"lang", "lastChild", "localName", "lookupNamespaceURI", "lookupPrefix", 
"namespaceURI", "nextSibling", "nodeName", "nodeType", "nodeValue", "normalize", 
"offsetHeight", "offsetLeft", "offsetParent", "offsetTop", "offsetWidth", 
"ownerDocument", "parentNode", "prefix", "previousSibling", "removeAttribute", 
"removeAttributeNS", "removeAttributeNode", "removeChild", "removeEventListener", 
"replaceChild", "scrollHeight", "scrollLeft", "scrollTop", "scrollWidth", 
"setAttribute", "setAttributeNS", "setAttributeNode", "setAttributeNodeNS", 
"setUserData", "spellcheck", "style", "tabIndex", "tagName", "textContent", 
"title"]