tag:crieit.net,2005:https://crieit.net/users/portaloo/feed portalooの投稿 - Crieit Crieitでユーザーportalooによる最近の投稿 2021-01-12T01:21:53+09:00 https://crieit.net/users/portaloo/feed tag:crieit.net,2005:PublicArticle/16580 2021-01-12T01:21:53+09:00 2021-01-12T01:21:53+09:00 https://crieit.net/posts/dom-document Documentとは <p>documentとはWebページ全体を表すインターフェイスです。</p> <h2 id="プロパティ"><a href="#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3">プロパティ</a></h2> <h3 id="各文書情報へのアクセス"><a href="#%E5%90%84%E6%96%87%E6%9B%B8%E6%83%85%E5%A0%B1%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9">各文書情報へのアクセス</a></h3> <pre><code class="javascript">console.log(document.body);// => body要素 console.log(document.documentElement);// => html要素 console.log(document.domain);// => example.com console.log(document.embeds);// => object要素のリスト console.log(document.fonts);// => FontFaceSet console.log(document.forms);// => form要素のリスト console.log(document.head);// => head要素 console.log(document.images);// => img要素のリスト console.log(document.lastModified);// => 最終更新日 console.log(document.links);// => hrefを持つ要素のリスト console.log(document.readyState);// => console.log(document.referrer);// => リンク元ページのURL console.log(document.scripts);// => script要素のリスト console.log(document.title);// => タイトル console.log(document.URL);// => 現在のページのURL </code></pre> <h3 id="文書の読み込み状況 document.readyState"><a href="#%E6%96%87%E6%9B%B8%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E7%8A%B6%E6%B3%81+document.readyState">文書の読み込み状況 document.readyState</a></h3> <pre><code class="javascript">document.addEventListener('readystatechange',function(){ console.log(document.readyState); switch (document.readyState) { case "loading": // 文書の読み込み中 break; case "interactive": // 文書読み込み完了、DOMアクセス可能、画像やスタイルシートの読み込み中 break; case "complete": // 文書読み込み完了、リソース読み込み完了 break; } }); </code></pre> <h3 id="テキストの表示方向 document.dir"><a href="#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%96%B9%E5%90%91+document.dir">テキストの表示方向 document.dir</a></h3> <pre><code class="javascript">document.dir = 'rtl'; // 右から左にテキストを表示 (right to left) document.dir = 'ltr'; // 左から右にテキストを表示 (left to right) </code></pre> <h3 id="表示中ページのURL document.location"><a href="#%E8%A1%A8%E7%A4%BA%E4%B8%AD%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AEURL+document.location">表示中ページのURL document.location</a></h3> <pre><code class="javascript">document.location.href = 'https://example.com/path/sample?query=value#hashsample'; // hrefの指定でページ遷移 console.log(document.location.href); // https://example.com/path/sample?query=value#hashsample console.log(document.location.protocol); // https: console.log(document.location.host); // example.com console.log(document.location.hostname); // example.com console.log(document.location.port); // console.log(document.location.pathname); // /path/sample console.log(document.location.search); // ?query=value console.log(document.location.hash); // #hashsample console.log(document.location.origin); // https://example.com </code></pre> <h3 id="クッキー document.cookie"><a href="#%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC+document.cookie">クッキー document.cookie</a></h3> <p><code>"キー名=値"</code>でクッキーの設定を行う。<br /> pathでクッキーを有効とするパス、domainでドメイン、secureでhttps通信時のみ送信、max-ageで寿命(秒)を指定できる。<br /> 寿命ではなく、expiresで有効期限を指定することも可能。</p> <p>```javascript document.cookie<br /> //クッキーの設定<br /> document.cookie = "key1=value1";<br /> document.cookie = "key2=value2; path=/; domain=exmaple.com;max-age=60;";<br /> document.cookie = <code>key3=value3; secure; expires=${new Date('2100/01/01').toGMTString()};</code>;<br /> console.log(document.cookie);<br /> // => "key1=value1; key3=value3;"</p> <p>//クッキーの削除<br /> document.cookie = "key1=; max-age=0;";<br /> document.cookie = <code>key3=; expires=${new Date(0).toUTCString()};</code>;<br /> console.log(document.cookie);<br /> // => ""</p> <pre><code><br />## メソッド ### 要素の作成 ```javascript const df = document.createDocumentFragment(); const element = document.createElement('div'); const text = document.createTextNode('テスト'); const comment = document.createComment('コメント'); element.appendChild(text); df.appendChild(element); df.appendChild(comment); console.log(df); /* => #document-fragment <div>テスト</div> <!--コメント--> */ </code></pre> <h3 id="セレクタ"><a href="#%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF">セレクタ</a></h3> <pre><code class="html"><div id="box"> <div class="classNameA">テスト1</div> <div class="classNameB">テスト2</div> <p class="classNameA classNameB">テスト3</p> <p class="classNameB">テスト4</p> <input type="text" name="firstNmae" id="idsample1" /> <input type="text" name="lastName" id="idsample2" /> </div> </code></pre> <pre><code class="javascript">console.log(document.getElementById('idsample1')); // => <input type="text" name="firstNmae" id="idsample1" /> console.log(document.getElementsByClassName('classNameA')); // => HTMLCollection(2) [div.classNameA, p.classNameA.classNameB] console.log(document.getElementsByName('firstNmae')); // => NodeList [input#idsample1] console.log(document.getElementsByTagName('input')); // => HTMLCollection(2) [input#idsample1, input#idsample2] console.log(document.querySelector('#idsample2')); // => <input type="text" name="lastName" id="idsample2" /> console.log(document.querySelectorAll('.classNameB')); // => NodeList(3) [div.classNameB, p.classNameA.classNameB, p.classNameB] </code></pre> portaloo tag:crieit.net,2005:PublicArticle/16577 2021-01-10T23:54:13+09:00 2021-01-10T23:54:13+09:00 https://crieit.net/posts/dom-element Elementとは <h1 id="Elementとは"><a href="#Element%E3%81%A8%E3%81%AF">Elementとは</a></h1> <p>Elementとは文書の要素を示すインターフェイスです。</p> <h2 id="プロパティ"><a href="#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3">プロパティ</a></h2> <h3 id="兄弟要素"><a href="#%E5%85%84%E5%BC%9F%E8%A6%81%E7%B4%A0">兄弟要素</a></h3> <pre><code class="html"><div> <p id="pa">A</p> <p id="pb">B</p> <p id="pc">C</p> </div> </code></pre> <pre><code class="javascript">console.log(document.getElementById('pb').previousElementSibling); //=> <p id="pa">A</p> console.log(document.getElementById('pb').nextElementSibling); //=> <p id="pc">C</p> </code></pre> <h3 id="各要素の値"><a href="#%E5%90%84%E8%A6%81%E7%B4%A0%E3%81%AE%E5%80%A4">各要素の値</a></h3> <pre><code class="html"><div id="box"> <p>テスト</p> </div> </code></pre> <pre><code class="javascript">console.log(document.getElementById('box').innerHTML); //=> " <p>テスト</p> " console.log(document.getElementById('box').outerHTML); //=> "<div id="box"> <p>テスト</p> </div>" console.log(document.getElementById('box').id); //=> "box" console.log(document.getElementById('box').localName); //=> "div" console.log(document.getElementById('box').tagName); //=> "DIV" console.log(document.getElementById('box').tabStop); //=> undefined </code></pre> <h3 id="属性のリスト attributes"><a href="#%E5%B1%9E%E6%80%A7%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88+attributes">属性のリスト attributes</a></h3> <pre><code class="html"><div id="box" name="boxName" class="style"></div> </code></pre> <pre><code class="javascript">console.log(document.getElementById('box').attributes); //=> NamedNodeMap {0: id, 1: name, 2: class, id: id, name: name, class: class, length: 3} </code></pre> <h3 id="クラス"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9">クラス</a></h3> <pre><code class="html"><div id="box" class="classA classB classC"></div> </code></pre> <pre><code class="javascript">console.log(document.getElementById('box').classList); //=> DOMTokenList(3) ["classA", "classB", "classC", value: "classA classB classC"] console.log(document.getElementById('box').className); //=> classA classB classC undefined </code></pre> <h3 id="要素の大きさと位置"><a href="#%E8%A6%81%E7%B4%A0%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%95%E3%81%A8%E4%BD%8D%E7%BD%AE">要素の大きさと位置</a></h3> <pre><code class="javascript">console.log(document.getElementById('text').clientWidth); // 要素の内部の幅 console.log(document.getElementById('text').clientHeight); //要素の内部の高さ console.log(document.getElementById('text').clientLeft); //要素左の位置 console.log(document.getElementById('text').clientTop); //要素上の位置 </code></pre> <h3 id="スクロール"><a href="#%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB">スクロール</a></h3> <pre><code class="javascript">console.log(document.getElementById('text').scrollHeight); //スクロールビューの幅 console.log(document.getElementById('text').scrollWidth); //スクロールビューの高さ console.log(document.getElementById('text').scrollLeft); //水平方向スクロール位置 console.log(document.getElementById('text').scrollTop); //垂直方向スクロール位置 </code></pre> <h2 id="メソッド"><a href="#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89">メソッド</a></h2> <h3 id="セレクタで祖先要素または地震を取得"><a href="#%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF%E3%81%A7%E7%A5%96%E5%85%88%E8%A6%81%E7%B4%A0%E3%81%BE%E3%81%9F%E3%81%AF%E5%9C%B0%E9%9C%87%E3%82%92%E5%8F%96%E5%BE%97">セレクタで祖先要素または地震を取得</a></h3> <pre><code class="html"><div> <div id="pa" class="class1"> <div id="pb" class="class2"> <div id="pc" class="class1"> </div> </div> </div> </div> </code></pre> <pre><code class="javascript">console.log(document.getElementById('pc').closest('div.class1')); // => <div id="pc" class="class1"> </div> console.log(document.getElementById('pc').closest('div.class2')); // => <div id="pb" class="class2">…</div> </code></pre> <h3 id="要素の取得"><a href="#%E8%A6%81%E7%B4%A0%E3%81%AE%E5%8F%96%E5%BE%97">要素の取得</a></h3> <pre><code class="html"><div id="box"> <p id="p1" class="classA">テスト1</p> <p id="p2" class="classB">テスト2</p> <p id="p3" class="classA">テスト3</p> </div> </code></pre> <pre><code class="javascript">const div = document.getElementById('box'); console.log(div.getElementsByClassName('classA')); //=> HTMLCollection(2) [p#p1.classA, p#p3.classA, p1: p#p1.classA, p3: p#p3.classA] console.log(div.getElementsByTagName('p')); //=> HTMLCollection(3) [p#p1.classA, p#p2.classB, p#p3.classA, p1: p#p1.classA, p2: p#p2.classB, p3: p#p3.classA] console.log(div.querySelector('#p2')); //=> <p id="p2" class="classB">テスト2</p> console.log(div.querySelectorAll('p.classA')); //=> NodeList(2) [p#p1.classA, p#p3.classA] </code></pre> <h3 id="属性の取得"><a href="#%E5%B1%9E%E6%80%A7%E3%81%AE%E5%8F%96%E5%BE%97">属性の取得</a></h3> <pre><code class="html"><div id="box" class="className" style="border:solid 1px black"></div> </code></pre> <pre><code class="javascript">const div = document.getElementById("box"); for(const name of div.getAttributeNames()) { const value = div.getAttribute(name); console.log(`${name}=${value}`); } //"id=box" //"class=className" //"style=border:solid 1px black" </code></pre> <h3 id="属性の存在チェック"><a href="#%E5%B1%9E%E6%80%A7%E3%81%AE%E5%AD%98%E5%9C%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF">属性の存在チェック</a></h3> <pre><code class="html"><div id="box" class="className">A</div> </code></pre> <pre><code class="javascript">const div = document.getElementById("box"); console.log(div.hasAttribute('id')); // true console.log(div.hasAttribute('style')); // false console.log(div.hasAttributes()); // true </code></pre> <h3 id="属性の削除チェック"><a href="#%E5%B1%9E%E6%80%A7%E3%81%AE%E5%89%8A%E9%99%A4%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF">属性の削除チェック</a></h3> <pre><code class="html"><div id="box" class="className">A</div> </code></pre> <pre><code class="javascript">const div = document.getElementById("box"); div.removeAttribute('class'); div.setAttribute('id','newid'); console.log(div.outerHTML);// => "<div id="newid">A</div>" </code></pre> <h3 id="属性の切り替え"><a href="#%E5%B1%9E%E6%80%A7%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88">属性の切り替え</a></h3> <pre><code class="html"><input type="text" /> <button>クリック</button> </code></pre> <pre><code class="javascript">const button = document.querySelector("button"); document.querySelector("button").addEventListener("click", function(){ var input = document.querySelector("input"); input.toggleAttribute("disabled"); }); </code></pre> <h3 id="要素、テキストの追加"><a href="#%E8%A6%81%E7%B4%A0%E3%80%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0">要素、テキストの追加</a></h3> <pre><code class="javascript">const div = document.createElement("div"); const divnew1 = document.createElement("div"); divnew1.id = "n1"; divnew1.textContent ="テスト" div.appendChild(divnew1); const divnew2 = document.createElement("div"); divnew2.id = "n2"; divnew1.insertAdjacentElement('beforebegin',divnew2); console.log(div.outerHTML); // => <div><div id="n2"></div><div id="n1">テスト</div></div> </code></pre> <pre><code class="javascript">const div = document.createElement("div"); const divnew1 = document.createElement("div"); divnew1.id = "n1"; divnew1.textContent ="テスト" div.appendChild(divnew1); divnew1.insertAdjacentHTML('afterbegin','<div id="n2"></div>'); console.log(div.outerHTML); // => <div><div id="n1"><div id="n2"></div>テスト</div></div> </code></pre> <pre><code class="javascript">const div = document.createElement("div"); const divnew1 = document.createElement("div"); divnew1.id = "n1"; divnew1.textContent ="テスト" div.appendChild(divnew1); divnew1.insertAdjacentText('beforeend','追加'); console.log(div.outerHTML); // => <div><div id="n1">テスト追加</div></div> </code></pre> <p>第一引数の位置指定は以下の中から選択できる。</p> <ul> <li><strong>beforebegin</strong> 対象要素の前</li> <li><strong>afterbegin</strong> 対象要素内の先頭</li> <li><strong>beforeend</strong> 対象要素内の末尾</li> <li><strong>afterend</strong> 対象要素の後</li> </ul> <h3 id="一致"><a href="#%E4%B8%80%E8%87%B4">一致</a></h3> <pre><code class="html"><ul> <li class="classA">1</li> <li class="classB">2</li> <li class="classA">3</li> </ul> </code></pre> <pre><code class="javascript">const items = document.querySelectorAll('li'); items.forEach(item => { console.log(item.matches('.classA')); }); // => true false true </code></pre> portaloo tag:crieit.net,2005:PublicArticle/16541 2021-01-06T02:05:48+09:00 2021-01-06T02:05:48+09:00 https://crieit.net/posts/EventTarget EventTargetとは <p>EventTargetはイベントのターゲットとなるオブジェクトです。<br /> イベントリスナーの登録や削除を行えます。</p> <h2 id="EventTargetのメソッド"><a href="#EventTarget%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89">EventTargetのメソッド</a></h2> <h3 id="addEventListener - イベントリスナの登録"><a href="#addEventListener+-+%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AA%E3%82%B9%E3%83%8A%E3%81%AE%E7%99%BB%E9%8C%B2">addEventListener - イベントリスナの登録</a></h3> <p>addEventListenerの第1引数にイベントの名称、<br /> 第2引数にイベント発生時に実行する関数を指定する事でイベントの登録が行なえます。</p> <p>例えば、クリックのイベントは以下のように登録できます。<br /> buttonAをクリックするとdiv要素のクリックイベントも呼び出されます。</p> <pre><code class="html"><div id="outer"> <div id="inner"> <button id="buttonA">A</button> </div> </div> </code></pre> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');}); document.getElementById('inner').addEventListener('click',function(){console.log('inner');}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA');}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');}); //buttonAをクリックする => buttonA buttonA2 inner outer </code></pre> <p>第3引数としてbooleanを指定可能で、上記はfalseを指定した以下と同様です。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');},false); document.getElementById('inner').addEventListener('click',function(){console.log('inner');},false); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA');},false); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');},false); //buttonAをクリックする => buttonA buttonA2 inner outer </code></pre> <p>第3引数としてtrueを指定すると、実行の順序が逆になります。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');},true); document.getElementById('inner').addEventListener('click',function(){console.log('inner');},true); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA');},true); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');},true); //buttonAをクリックする => outer inner buttonA buttonA2 </code></pre> <p>イベントリスナーが登録されていると、イベント発生元となった要素を含む親の要素でもそのイベントが実行されます。<br /> そのイベントの実行順序が3つ目の引数で制御できるようになっています。</p> <p>イベントの伝播はwindowオブジェクトからイベント発生元まで下位へ辿っていくキャプチャーフェーズと、<br /> イベント発生元から上位要素へと辿っていくバブリングフェーズがあります。<br /> つまり、「ouuter -> inner -> buttonA -> inner -> outer」の順序でイベントが伝播し、<br /> 前半がキャプチャーフェーズ、後半がバブリングフェーズとなっています。<br /> 引数をtrueとするとキャプチャーフェーズでイベントが実行されるため順序が逆となったというわけです。</p> <p>もちろん混在も可能で、次のようにすると「outer -> buttonA -> inner」と実行がされます。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');},true); document.getElementById('inner').addEventListener('click',function(){console.log('inner');},false); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA');}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');}); //buttonAをクリックする => outer buttonA buttonA2 inner </code></pre> <p>イベントの伝播はstopPropagation()で止める事ができます。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');}); document.getElementById('inner').addEventListener('click',function(e){console.log('inner');e.stopPropagation();}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA');}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');}); //buttonAをクリックする => buttonA buttonA2 inner </code></pre> <p>ただし、stopPropagation()だと同じ要素に登録したリスナーの実行は止められません。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');}); document.getElementById('inner').addEventListener('click',function(){console.log('inner');}); document.getElementById('buttonA').addEventListener('click',function(e){console.log('buttonA');e.stopPropagation();}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');}); //buttonAをクリックする => buttonA buttonA2 </code></pre> <p>同じ要素のリスナーも含め、イベントの実行を止めるには、stopImmediatePropagation()を使います。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(){console.log('outer');}); document.getElementById('inner').addEventListener('click',function(){console.log('inner');}); document.getElementById('buttonA').addEventListener('click',function(e){console.log('buttonA');e.stopPropagation();}); document.getElementById('buttonA').addEventListener('click',function(){console.log('buttonA2');}); //buttonAをクリックする => buttonA </code></pre> <p>既定の動作、例えばチェックボックスクリック時のチェックを止めたい場合はpreventDefault()で処理を停止できます。</p> <pre><code class="html"><label><input id="check" type="checkbox" />Check</label> </code></pre> <pre><code class="javascript">document.getElementById('check').addEventListener('click',function(e){e.preventDefault();}); </code></pre> <p>addEventListenerの第3引数には、より複雑なオブジェクトをオプションとして指定する事もできます。</p> <pre><code class="javascript">document.getElementById('outer').addEventListener('click',function(e){console.log('outer');e.preventDefault();},{ capture : true , once : true, passive :false, }); document.getElementById('inner').addEventListener('click',function(e){console.log('inner');e.preventDefault();},{ capture : true , once : true, passive :true, }); document.getElementById('buttonA').addEventListener('click',function(e){console.log('buttonA');e.preventDefault();},{ capture : true , once : false, passive :false, }); //buttonAをクリックする(1回目) => outer inner (警告) buttonA //buttonAをクリックする(2回目) => buttonA </code></pre> <p>「capture」は第3引数にbooleanを指定したときと同じものです。trueの場合にバブリングフェーズでのイベント実行が行われます。<br /> 「once」はtrueの場合、イベントの実行を1回行うとリスナは削除されます。<br /> 「passive」はtrueの場合、preventDefault()がリスナで呼ばれるとコンソールに警告が出力されます。</p> <h3 id="removeEventListener - イベントリスナの削除"><a href="#removeEventListener+-+%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AA%E3%82%B9%E3%83%8A%E3%81%AE%E5%89%8A%E9%99%A4">removeEventListener - イベントリスナの削除</a></h3> <p>removeEventListenerを使うと、指定したイベントからリスナを削除できます。</p> <pre><code class="html"><div id="outer"> <div id="inner"> <button id="buttonA">A</button> </div> </div> </code></pre> <pre><code class="javascript">const clickListener1 = function(){console.log('buttonA1');}; const clickListener2 = function(){console.log('buttonA2');}; document.getElementById('buttonA').addEventListener('click',clickListener1); document.getElementById('buttonA').addEventListener('click',clickListener2); document.getElementById('buttonA').removeEventListener('click',clickListener1); //buttonAをクリックする => buttonA2 </code></pre> <p>第2引数を指定すると、キャプチャーフェーズで実行されるリスナであるかが一致する場合にだけ削除が行われます。</p> <pre><code class="javascript">const clickListener1 = function(){console.log('buttonA1');}; const clickListener2 = function(){console.log('buttonA2');}; document.getElementById('buttonA').addEventListener('click',clickListener1,false); document.getElementById('buttonA').addEventListener('click',clickListener2,true); document.getElementById('buttonA').removeEventListener('click',clickListener1,false); document.getElementById('buttonA').removeEventListener('click',clickListener2,false); //buttonAをクリックする => buttonA2 </code></pre> portaloo