0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaScriptを初めて学ぶ5

Posted at

ノードとはHTML上ではエレメントとかタグを指す。<bodyとか、<sectionとか、<pとか。
そのノードを追加する方法があるので学んでいく

・createTextNode
テキストノードを作成する→document.createTextNode(text)

・appendChild
指定された要素をその場所の要素の最後の子要素として追加。(DOMツリー上で下)
element.appendChild(node(追加する子ノード))
戻り値は追加した子ノードの値

例えば

...
<body>
    <ul id="list">
    </ul>
    <input id="button" type="button" value="add">
    <script src="main.js"></script>
</body>

空の何も表示されてないリストとaddボタンがweb上で表示されてる。
じゃあノードをjavascriptで追加していこう↓

const e = document.getElementById('button'); 
e.addEventListener('click', () => {  
    const l = document.createElement('li'); //定数l=liを作成
    const addsuru= document.createTextNode('リスト作成!'); //定数addsuru=ノードのテキスト作成
    l.appendChild(addsuru); // liタグの要素にテキストaddsuruを追加
    const listElement = document.getElementById('list'); //定数listElement= idがlistに、liタグを追加
    listElement.appendChild(l); //<li>リスト作成!</li>が追加される

}, false);

少しややこしいけど、ボタンを押すと↓
最初に定数lでliタグ作成。次に定数addsuruでタグ内のテキスト作成(リスト作成!)
んで、l.appendChild(addsuru)で、lの中にaddsuruを入れる。つまりここで

リスト作成!ができる。
そして定数listElement=listのidをゲット。つまりulのノード
最後にlistElement.appendchild(l)で<ulの中に、l=<liリスト作成!</liを入れる。
ul → li → テキストを、appendChildで入れる感じ。子から子へ。

また、ノードを入れ替える方法
・replaceChild
指定した子ノードを置き換える→ replaceNode= parentNode.replaceChild(newChild.oldChild)
parentNode=置き換え対象の親ノード
newChild=置き換え後のノード
oldChild=置き換え対象のノード
replaceNode=置き換えられたノード

例えば

...
<body>
    <ul>
        <li id="oldList">古い要素</li>
    </ul>
    <input id="button" type="button" value="置き換え">
    <script src="main.js"></script>
</body>

で、WEB上ではボタンと古い要素、というテキストが表示
JavaScriptで↓

const e = document.getElementById('button'); 
e.addEventListener('click', () => {  
    const newOne = document.createElement('li'); //定数newlist=liノードを作成
    newOne.setAttribute('id','newList'); //newlist=liノードにid属性newListをつける
    const newText=document.createTextNode('新しい要素'); //テキストノードを作成
    newOne.appendChild(newText); //作成したノードを空の子要素として追加。<li id=newList>のとこに追加てこと
    const oldOne=document.getElementById('oldList'); //oldOne=id=oldListのとこゲット
    const parentNode=oldOne.parentNode; //parentNode=oldListはこれから置き換え対象の親ノードですよ
    parentNode.replaceChild(newOne,oldOne); //parentNodeはoldListからnewListに置き換わる
}, false);

すると、ボタンを押すと「古い要素」→「新しい要素」に置き換わる。
最初に

新しい要素と言う置き換えたいノードを作って
次に古い要素をゲット
そしたらあとは、const parent=oldOne.parentNode;と言う親ノードを作って
parentNode.replaceChild(newOne, OldOne);で置き換える

また、ノードを削除する方法
・removeChild
指定した子ノードを取り除く→oldChild=element.removeChild(child)
child=取り除く子ノード
oldChild=取り除かれた子ノードの参照(参照とは、オブジェクトが存在している場所を指し示すもの)
取り除いたノードoldChildは再利用可能

<body>
    <ul id="list">
        <li>要素1</li>
        <li>要素2</li>
        <li>要素3</li>
        <li>要素4</li>
        <li>要素5</li>
    </ul>
    <input id="button" type="button" value="削除!">
    <script src="main.js"></script>
</body>

要素1、2、3、4、5のリストと削除ボタンがweb上に表示。

const e = document.getElementById('button'); 
e.addEventListener('click', () => {  
    const parentElement = document.getElementById('list'); //id="list"の要素をゲット。つまり親ノード
    const elements = parentElement.getElementsByTagName('li'); //liタグの要素をゲット。つまり子ノード
    const removeIndex = elements.length -3; //定数elements内の中から削除するインデックス番号をゲット
    parentElement.removeChild(elements[removeIndex]); //親ノード内のエレメントを消してく
}, false);

elements.length(1~5あるよ) - 1
で実行すると、要素5から消える。なぜ??
もし、−1がなかったら、elements.lengthの5から消すことになる。
配列のインデックスは0から始まるので、5はなく、4(要素5)までしかない。
なので−1をして、4(要素5)から消せるようにしている。
だからもし-3とかにしたら、2(要素3)から消える。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?