このtodoリストには「追加」「削除」はあるが、「検索」「更新」はないので留意する。
★ソースコード
html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div> <input type="text" id="title" /> <button id="add">Add</button> </div> <ul id="todo"> <!-- ここからtemplate要素 --> <template id="template"> <li> <span>titleが入る</span> <button>delete</button> </li> </template> </ul> </body> <script src="app.js"></script> </html> |
js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// jsでtemplateを扱う (function(){ // 1. template要素を取得 var template = document.getElementById('template'); // titleを入力するinput要素 var title = document.getElementById('title'); // todoリスト var todo = document.getElementById('todo'); // Addボタン document.getElementById('add').addEventListener('click', function(){ //入力されてなければ何もしない if (!title.value) return; // 2. 複製 var clone = document.importNode(template.content, true); // 3. なにかする // 背景色を変更 clone.firstElementChild.style.background = '#'+Math.floor(Math.random()*16777215).toString(16); // 入力されたtitleをいれる clone.querySelector('span').textContent = title.value; // ボタンが押されたらリストから削除する clone.querySelector('button').addEventListener('click', function(){ var parent = this.parentNode; parent.parentNode.removeChild(parent); }); //複製した要素をリストに追加する todo.insertBefore(clone, todo.firstChild); // titleの値を空にしておく title.value = ''; }); })(); |
メモ
HTML のコンテンツテンプレート (template) 要素 は、すなわちページの読み込み時にすぐには描画されないものの、後で JavaScript を使用してインスタンスを生成できる HTML を保持するメカニズムです。
テンプレートは、文書内に格納されたコンテンツの断片として考えてください。
ページの読み込み時にパーサーが template要素の内容を処理している間、その内容の有効性のみが検証されます。
しかし、要素の内容は描画されません。
※templateタグは、単体では表示されない。必ずjsと組み合わせること。
※jsを使って、template要素内のタグを複製できたりする?
パーサーとは、コンピュータプログラムのソースコードやXML文書など、何らかの言語で記述された構造的な文字データを解析し、プログラムで扱えるようなデータ構造の集合体に変換するプログラムのこと。
※templateタグの解析に、パーサーが使われる?
そのような処理のことを「構文解析」「パース」(parse)という。
解析対象となるテキストデータが記述された言語の語彙や記法、文法などのルールを元に、記述内容を要素や属性などに分け、それらの間の関係を読み取って木構造(ツリー)などのデータ構造や何らかのデータ記述言語による表記として出力する。
パーサはそれ単体で利用されることはあまりなく、何らかの処理をするための前段階として使われることが多いため、汎用のサブルーチンやモジュール、ライブラリなどとして提供されることが多い。
プログラミング言語などのコンピュータ言語を対象とするものが多いが、日本語や英語など人間が使う自然言語の文章を対象とするものもある。
文章を読み込んで形態素解析(分かち書きをしない日本語などの文章を単語に分解する)や構文解析(単語間の関連を確定する)などを行い、何らかの形式のデータ構造として表現する。
importNode()は、Documentのメソッドです。
外部のドキュメントから自身のドキュメントにノードを複製します。
元のノードはなくなりません。
●メモ
外部ドキュメントからのノードは、現在のドキュメントに挿入する前に document.importNode() を使ってクローンを作るべきです。
●構文
1 |
var node = document.importNode(externalNode, deep); |
・node(例題ではcloneと記載)
インポートするノードのスコープにあるコピーされたノードです。
この新しいノードはまだドキュメントツリーに挿入されていないので、 Node.parentNode は null です。
・externalNode
現在の文書にインポートする、外部の Node または DocumentFragment です。
・deep
真偽値で、 externalNode の DOM サブツリー全体をインポートするかどうかを制御します。
→deep が true に設定された場合、 externalNode およびその子孫全てが複製されます。
→deep が false に設定された場合、 externalNode のみがインポートされます
JavaScriptの、ElementオブジェクトのfirstElementChildは最初の子要素を取得するプロパティです。
ElementオブジェクトのfirstElementChildプロパティは、最初の子要素を含みます。
子要素がない場合はnullが返ります。
1 2 3 4 5 6 7 8 9 10 11 12 |
<ul id="target"> <li>要素1</li> <li>要素2</li> <li>要素3</li> </ul> <script> // 要素を取得 ( → <ul id="target"> ... </ul> ) var ulElement = document.getElementById( "target" ) ; // 最初の子要素を取得 ( → <li>要素1</li> ) var firstElementChild = ulElement.firstElementChild ; </script> |
Object.values() メソッドは、指定されたオブジェクトが持つ列挙可能なプロパティの値を、 for…in ループで提供される場合と同じ順序で配列にして返します。
1 2 3 4 5 6 7 |
const object1 = { a: 'somestring', b: 42, c: false }; console.log(Object.values(object1)); // expected output: Array ["somestring", 42, false] |
●構文
Object.values(obj)
→obj:返されることになる列挙可能な自身のプロパティの値を持つオブジェクト。
→返り値:与えられたオブジェクトが所有する列挙可能なプロパティの値が入った配列。
1 2 |
const obj = { foo: 'bar', baz: 42 }; console.log(Object.values(obj)); // ['bar', 42] |
for in:配列の1個1個のキーを取り出してくれる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
var arr = ['HTML', 'CSS', 'javascript', 'PHP', 'ネットワーク・サーバー・セキュリティ', '営業', '起業']; for(var key in arr){ console.log('ウェブカツで学ぶのは' + key + 'です。'); } //ウェブカツで学ぶのは0です。 //ウェブカツで学ぶのは1です。 //ウェブカツで学ぶのは2です。 //ウェブカツで学ぶのは3です。 //ウェブカツで学ぶのは4です。 //ウェブカツで学ぶのは5です。 //ウェブカツで学ぶのは6です。 //ーーーーーーーーーーーーーーーーーー // キーしか取れないので、値を取得したいならこう使う //ーーーーーーーーーーーーーーーーーー for(var key in arr){ console.log('ウェブカツで学ぶのは' + arr[key] + 'です。'); } //ウェブカツで学ぶのはHTMLです。 //ウェブカツで学ぶのはCSSです。 //ウェブカツで学ぶのはjavascriptです。 //ウェブカツで学ぶのはPHPです。 //ウェブカツで学ぶのはネットワーク・サーバー・セキュリティです。 //ウェブカツで学ぶのは営業です。 //ウェブカツで学ぶのは起業です。 |
指定されたノードの DOM ツリー内の親ノードを返します。
●構文
parentNode = node.parentNode
→parentNode:指定ノードの親ノード。要素の親ノードは、Element ノード、Document ノード、または DocumentFragment になります。
要素を DOM に追加する insertBefore と appendChild の使い方です。
●insertBeforeで要素の前に挿入する
insertBeforeは指定した要素を現在の要素の子要素として対象要素の前に挿入します。文字だけ見ると要素がいっぱいでてきて混乱してしまいますね。
var insertedElement = parentElement.insertBefore(newElement, referenceElement)
→parentElement:挿入したい位置の親要素
→newElement:挿入したい要素 ( 戻り値 insertedElement も同じ )
→referenceElement:この要素の前に newElement が挿入される
以下のDOMに、
1 2 3 4 5 |
<div id="article"> <div class="title"></div> <div class="image"></div> <div class="content"></div> </div> |
class=”image”要素の前にclass=”date”の要素を追加する
1 2 3 4 5 6 7 8 |
<script> var newEle = document.createElement('div'); newEle.classList.add('date'); var parent = document.getElementById('article'); var reference = document.querySelector('.image'); var rtn = parent.insertBefore(newEle, reference); console.log(rtn); // <div class="date"></div> </script> |
Element は Document の中にあるすべての要素オブジェクト が継承する、もっとも一般的な基底クラスです。
このインターフェイスは、すべての種類の要素に共通するメソッドとプロパティを記述するだけのものです。
多くの具体的なクラスが Element を継承します。
●プロパティ
・Element.classList
class 属性のトークンリストを含む DOMTokenList を返します。
Element.classList は読み取り専用のプロパティで、生きた DOMTokenList コレクションでその要素の class 属性を返します。
classList を使用することは、 element.className から取得した空白区切りの文字列として要素のクラスのリストにアクセスすることの便利な代替手段になります。
・Element.innerHTML
DOMString 型であり、要素内容のマークアップを表します。
Element オブジェクトの innerHTML プロパティは、要素内の HTML または XML のマークアップを取得したり設定したりします。
・Element.className
DOMString 型であり、要素のクラスを表します。
className は要素の class 属性の値の取得 / 設定に用います。
ウェブのコードを書く時は、数多くの Web API が利用できます。
下に、ウェブアプリやサイトを開発する際に利用することができる可能性があるすべてのインターフェイス (オブジェクト型) のリストを挙げます。
●仕様書
利用可能なすべての API の一覧です。
・CSS Object Model
・DOM
・Fetch API
・Service Workers API
・Storage
・Web Animations
・Web Storage API
・Web Workers API
・Websockets API
●インターフェイス
利用可能なすべてのインターフェイス (すなわちオブジェクトの型) の一覧です。
・Attr
・Blob
・Document
・Event
・EventListener
・File
・FileReader
・FormData
・History
・HTMLDivElement
・Location
・MouseEvent
・Navigator
・Node
・ServiceWorker
・Storage
・StyleSheet
・Text
・URL
・Window
・Worker
・XMLHttpRequest
Document インターフェイスはブラウザーに読み込まれたウェブページを表し、 DOM ツリーであるウェブページのコンテンツへのエントリーポイントとして働きます。
DOM ツリーは や