質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

7回答

2787閲覧

appendChildの挙動について教えて下さい。【JavaScript】

WeilSpinor

総合スコア170

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/03/31 10:06

編集2019/04/01 16:55

appendChildの挙動について教えて下さい。【JavaScript】

プログラミング初心者です。
documentオブジェクトのappendChildメソッドは、
「追加するノードが既にdocument内に存在するノードの参照であった場合、
もともとあった方を削除してから追加する」

そして
「document内に同じノードが2個以上存在できない」
そうですが、
appendChildおよびdocumentは何をもって、

『もともとdocument内に存在するノードA』

『新しく追加しようとしているノードA'』
が同じものである

と判断しているのかわかりません。

###実際に困っていること
html+JavaScript+CSSで、以下のようなプログラムを作っているのですが、
挙動がうまくいきません:

〈要件定義〉
・黄色の背景のdiv領域(id="wrapper")に
** 赤色の小さなdivの箱(class="hako")を**
** 一定時間毎(2秒)に無限増殖させる。**
・スタートボタンを押すと、赤いdiv箱が出現して増殖を開始し、
** 放っておけば2秒ごとに領域内にdiv箱が一つずつ生成される。**
〈問題点〉
・ボタンを押しても、div箱は、見た感じは初めの一個しか生成されない。
・開発者ツールを見ると「一応、div箱は2秒ごとに生成されてはいる」と思われる。
・原因はおそらく、上記のappendChildの仕様により、生成する毎に元あった箱が削除されているのではないか、と思われる

以下が、問題のコードになります。
### コード
OSはWindows10、ブラウザはchromeです。
【html】

html

1<!--<!DOCTYPE html> 2DOC宣言を書くと、互換モードから標準モードになり、 3styleに不具合が生じる!これから書かない! 4--> 5<html lang="ja" dir="ltr"> 6 <head> 7 <meta charset="utf-8"> 8 <link rel="stylesheet" type="text/css" href="zoushoku.css"> 9 <script src="zoushoku.js" charset="utf-8"></script> 10 <title>増殖(オブジェクト指向的)</title> 11 </head> 12 <h1>増殖(オブジェクト指向的)</h1> 13 <body> 14 下のボタンを押すとボックスが生まれます。 <br> 15 一定時間ごとに増殖します。 <br> 16 <button id="startBtn" name="startBtn" type="button">start</button><br> 17 <div id="wrapper" class="clearfix"></div> 18 </body> 19</html> 20

【css】

css

1@charset "UTF-8"; 2/*.clearfix:after{ 3 content:""; 4 display:block; 5 clear:both; 6} 7*/ 8#wrapper{ 9 width:500; 10 height:500; 11 background-color: yellow; 12} 13 14.hako{ 15 width: 30; 16 height: 30; 17 background-color: red; 18} 19

【JavaScript】

javascript

1window.onload = function() { 2 3 /*増殖するhakoの設計図*/ 4 var hako = document.createElement("div");//新しいdivエレメントを生成 5 hako.className = "hako";//class名はhako 6 7 /*hakoが住んでいるdivエレメント領域をwrapperとする。*/ 8 var wrapper = document.getElementById("wrapper"); 9 10 /*hakoの増殖関数*/ 11 function zoushoku(){ 12 setInterval(function(){wrapper.appendChild(hako)},2000); 13 };//こうして関数宣言によってラッピングしてやれば、setIntervalは勝手に実行しない。 14 var start = document.getElementById("startBtn");//増殖スタート 15 start.addEventListener("click", zoushoku); 16 17};

原因の検討はついたものの

私の仮説が正しければ、

「appendChildによって、毎回(2秒ごとに)、ノードの追加の前に、ノードの削除が行われている」

つまり、

「同じファイル名のファイルを作成するとき、もともとあるファイルを削除してから作成する」

みたいなことがされている、ということなので、
追加するdiv箱のプロパティを調整することが必要なのではないかと思いました。

しかし、appendChildが何をもって、
「もともとdocument内にあるdiv箱と、これから追加しようとしているdiv箱が同じ」
と判断しているのか、調べても分からないので、対処の仕方がわかりません。

「classNameが重複しているのがいけないのか」と一瞬思いましたが、
class名はidとは違って個体識別子ではないので、そこを疑うのは不自然だと思いました。

あと考えられることといったら、
「JavaScript、HTMLの言語処理系の仕様により、
HTMLドキュメント内のDOMと、JavaScriptのスクリプト内の変数が、
同期されてしまっている」
というところでしょうか?
そこらへんの言語処理系の仕組みについてはあまり勉強が進んでいないので、対処の仕方がわかりません。

どう思われますか?ご回答宜しくお願いします。
###追記
ベストアンサーにとても迷いましたが、今回は、
問題の核心的な部分を理解する糸口を最初に示して頂いたmaisumakun様をベストアンサーにさせて頂きたいと思います。
他の皆さまも、とても参考になりました!ご回答ありがとうございました!

最後に、修正したjsのコードを這っておきます。
setInterval毎にcreateElementを発動するように、createElementのところもzoushoku(){}の内部に包んでやりました。

javascript

1window.onload = function() { 2 3 4 /*hakoが住んでいるdivエレメント領域をwrapperとする。*/ 5 var wrapper = document.getElementById("wrapper"); 6 /*hakoの増殖関数*/ 7 function zoushoku(){ 8 /*増殖するhakoの設計図*/ 9 /*createElementは同じ宣言から生まれたオブジェクトは同じものとみなされ、 10* appendCHild標準機能である「同一オブジェクトの追加時には元のものを削除」 11が発動してしまうため、この関数の内部に記述して、 12次から次へとcreateElementを宣言しなおさなければならない。 13そうすることで、「別々のcreateElement」から「別々のオブジェクト」がちゃんと生成される*/ 14 var hako = document.createElement("div"); 15 hako.className = "hako";//class名はhako 16 wrapper.appendChild(hako);//子ノードリストにノードを追加 17 };//こうして関数宣言によってラッピングしてやれば、setIntervalは勝手に実行しない。 18 var start = document.getElementById("startBtn");//増殖スタート 19 start.addEventListener("click", function(){ 20 setInterval(zoushoku,2000) 21 }); 22 23}; 24

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/31 10:09

やめませんか?仮説とか。 例え話と同じでプログラミング言語本体から離れてしまうので単なる憶測になって話にならないし、初心者の仮説とか何の理解にもつながりません。
WeilSpinor

2019/03/31 10:33 編集

やってほしいことだけを丸投げする『教えてくん』は嫌がられる、と聞き、 そうならないためには、「初心者なりに自己解決の努力をするべき」と教わったので、 こうして、リサーチを重ね、マニュアルをみて検証し、間違いを探す、ということをしたうえで、質問いたしました。 その過程を、「推測を全く排除して実行する」というやり方を、私は知りません。 後学のため、私はどうすればよかったのか、教えて頂けると幸いです。 (これをもって「教えてもらおうとするな」とおっしゃるのであれば、ご返信は結構です)
m.ts10806

2019/03/31 10:37

これまで何度も何度も指摘されてるじゃないですか。 仕様をそのまま受け取ってコード書けって。 それができないならプログラミングやめた方がいいです。仕様にそって動くだけのもの、それ以上の理解は邪魔でしかない。ロジックだけ考えること。 で、何になりたいんでしたっけ?目標は言語を作る人ですか?既存の言語でなにかを作る人ですか?趣味ですか?仕事ですか? 仮に仕事だとしたら無理でしょうね。
WeilSpinor

2019/03/31 10:54 編集

もちろん、読むだけで実際の実装の仕方やコツ、注意点、その他見落としていることに気付けるなら良いですが、いまの私には経験が足りないうえ、mts様ほどの太平洋の如く広大なワーキングメモリを持っているわけでも、素晴らしい理解力があるわけでもないと思います。 だからといって、 その都度その都度、その人にとってちょうど良くわかりやすい説明をしてくれている記事が都合よく存在するわけではないですし、 それならば、仕様書を読む能力をあげるしかなく、 仕様書を読む能力をあげるためには、 原理を知るのが近道である。 凡人たるわたくしがプログラミングを理解するためには、身の程をわきまえつつ、 こういった不断の工夫の日々が必要だと、思っただけです。 ご返信は結構です。
m.ts10806

2019/03/31 10:57

今まで一通り無視してきた方が「ご返信は結構です」とは横暴ですね。 話を話の通り受け取らない人はどんなことでも理解が進むようにはなりませんよ。 本来そういう指摘をする場ではないのは重々承知ですが、あなたについては仕様書や記事が問題ではないです。あなた自身の性格です。 車や自転車を運転するのにその原理って必要な知識ですか?洗濯機を使うのに原理は必要な知識ですか? 説明書にどこまで書いてありますか? 車や洗濯機を作るなら必要でしょうね。使うなら全く不要です。
guest

回答7

0

ベストアンサー

hakoを生成している(document.createElementを呼んでいる)のは、window.onload1回のみです。Timerが動作しても、同じインスタンスをそのまま使い回すこととなります。


本題ではありませんが、いまどきあえて互換モードで書くべきではありません。素直に<!DOCTYPE html>で標準モードで書きましょう。jQueryすら、互換モードでの動作を保証していません。

投稿2019/03/31 10:18

編集2019/03/31 10:20
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/31 13:32

ご回答ありがとうございます。 >hakoを生成している(document.createElementを呼んでいる)のは、window.onloadの1回のみです。Timerが動作しても、同じインスタンスをそのまま使い回すこととなります。 「同じインスタンスを使い回すことになる」ということの意味について、 これに関連して、 上の回答者様(otn様)がおっしゃっていたことで、 「別々のcreatElementで作ったノードたちは別モノ」 というのがありますが、 これは、イメージとしては、 creatElementというメソッドにはカウンタのようなものが定義されていて、 実行毎にカウントが更新され、 生成されたノードにはそのカウントデータを渡しており、 そのカウントをラベルにノード同士の違いを判断している、 ような感じでしょうか? マニュアルhttps://developer.mozilla.org/ja/docs/Web/API/Document/createElement にはそのようなことは書いていないので想像ですが、 いずれにしても、何かしら似たような動的なラベル付け機能がないと、つじつまが合わないきがします。
WeilSpinor

2019/03/31 13:33

もしかして、ここで、 オブジェクト指向プログラミングのクラスやインスタンス、コンストラクタ、new演算子などのちゃんとした理解が求められる感じでしょうか?
maisumakun

2019/03/31 13:34

> イメージとしては、 全然違います。たとえば、「{} == {}」がfalseとなるように、「動的なラベル付け機能」なんてなくても、オブジェクトの同一性判定はきちんと作りつけてあります。
maisumakun

2019/03/31 13:35

> もしかして(後略) いえ、そんなところに踏み込まないでください。
WeilSpinor

2019/03/31 13:45

なるほど…オブジェクトって難しい(というより奥深い?)んですね…。 とりあえず、ブラックボックスには目をつむって、 「別々のメソッド宣言から生み出されるオブジェクト(インスタンス)は別々のモノと判定される」 と覚えておきます。(原理を知りたければ、関数やオブジェクト、トークンの意味の理解とか、ですかね…) ご回答ありがとうございます。
guest

0

Node.prototype.appendChild

仕様を読みましょう。

Re: WeilSpinor さん

投稿2019/03/31 13:32

編集2019/03/31 13:33
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/04/01 16:25

ご回答ありがとうございます。参考にさせてきた抱きます
guest

0

appendChildが何をもって、

「もともとdocument内にあるdiv箱と、これから追加しようとしているdiv箱が同じ」
と判断しているのか、

createElementで作った1つのエレメントは、どこの変数に代入しようが、どこにappendChildしようがずっと同じ物です。
別々のcreateElementで作った別々のエレメントは別の物です。

投稿2019/03/31 12:20

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/31 12:45

ご回答ありがとうございます。 そのご説明だと、 createElementで作ったエレメントには、 それを宣言したJavaScript上と生成先のHTML上において、 同じものであることを規定する、なんらかの「リレーション」が定義される、 という機能があるのでしょうか?
otn

2019/03/31 12:49

そういうことではありません。2つのものがあり、その間に「同じ」という関係があるのではなく、最初から1つなのです。 「生成先のHTML」というより「生成先のDOM」ですね。
WeilSpinor

2019/03/31 13:24 編集

そうですか…。 上のコードでは、 createElementで作ったdiv要素を格納した変数hakoを、zoushoku関数内部のsetIntervalの引数にセットして、clickで引火してドキュメント内のDOMに射出しているわけですが、 2回目以降は、一つ前に射出したものの「完全なコピー」を射出しているに過ぎない、ということですかね…。 …多分、わかりました。 一連の動作・判断の主体はあくまで「JavaScript」ということを考えれば、合点がいきます。 ところで、 「別々のcreatElementで作ったノードたちは別モノ」 ということは、イメージとしては、 creatElementというメソッドにはカウンタのようなものが定義されていて、 実行毎にカウントが更新され、 生成されたノードにはそのカウントデータを渡しており、 そのカウントをラベルにノード同士の違いを判断している、 ような感じでしょうか? マニュアルhttps://developer.mozilla.org/ja/docs/Web/API/Document/createElement にはそのようなことは書いていないので想像ですが、 いずれにしても、何かしら似たような動的なラベル付け機能がないと、つじつまが合わないきがします。
guest

0

HTML

1<button id="startBtn">startBtn</button> 2<button id="stopBtn">stopBtn</button> 3<button id="clearBtn">clearBtn</button> 4<div id="wrapper"></div> 5

js

1document.addEventListener( 'DOMContentLoaded' , e=> { 2 let intervalID; 3 let wrapper = document.getElementById( 'wrapper' ); 4 document.getElementById( 'startBtn' ).addEventListener( 'click' , e=> { 5 intervalID = setInterval( e=>{ 6 let hako = document.createElement( 'div' ); 7 hako.className = 'hako'; 8 hako.innerHTML = 'hako'; 9 wrapper.appendChild( hako ) 10 }, 1000 ); 11 }, false ); 12 document.getElementById( 'stopBtn' ).addEventListener( 'click' , e=> { 13 clearInterval( intervalID ); 14 }, false ); 15 document.getElementById( 'clearBtn' ).addEventListener( 'click' , e=> { 16 clearInterval( intervalID ); 17 wrapper.innerHTML = ''; 18 }, false ); 19}, false ); 20```**動くサンプル:**[https://jsfiddle.net/L6zfejxy/](https://jsfiddle.net/L6zfejxy/)

投稿2019/03/31 10:32

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/04/01 16:25

ご回答ありがとうございます。参考にさっせえていkただ来ます
WeilSpinor

2019/04/01 16:27

アロー関数など、普段使わない記法が習えて助かります。 じっくり勉強させていただきます
guest

0

DOMはツリー構造なので、ノードは複数の親要素を持てないのです。
ですから、ある要素がappendChildメソッドにより別の親要素の子要素となった場合、前の親要素との親子関係は保持できないです。

なんか分かりにくいかな、と思って追記を書いている間に解決しちゃった件

js

1{ 2//配列で試す。 3 4//子要素 5 const c1 = ['c1']; 6 const c2 = ['c2']; 7//親要素 8 const p1 = [c1]; 9 const p2 = [c2]; 10 11//親要素の中身はこうなってる。 12 p1; 13/* 14[['c1']] 15*/ 16 p2; 17/* 18[['c2']] 19*/ 20 21//親要素 p1 に、子要素 c2 を追加する。 22 p1.push(c2); 23//親要素の中身はこうなる。 24 p1; 25/* 26[['c1'],['c2']] 27*/ 28 p2; 29/* 30[['c2']] 31*/ 32 33/* 34一見、c2が増えたように見えるけど、実は増えていない。 35p1[1] と p2[0] は同じ c2 を見ている。 36*/ 37 38//子要素 c2 を書き換える。 39 c2[1] = "c2の2" 40//親要素の中身はこうなる。 41 p1; 42/* 43[["c1"],["c2","c2の2"]] 44*/ 45 p2; 46/* 47[["c2","c2の2"]] 48*/ 49 50/* 51上記のとおり、p1[1] と p2[0] は同じ c2 を見ている。 52ただし、配列はツリー構造ではないから、親を複数持てるので、こうなる。 53*/ 54}

投稿2019/04/01 14:55

編集2019/04/01 16:35
Lhankor_Mhy

総合スコア36104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/04/01 16:21

ご回答ありがとうございます。 ネットワーク構造ではなく、ツリー構造だから、親を複数持てないんですね。なるほど…。
WeilSpinor

2019/04/01 16:35

追記ありがとうございます。 すみません…。 大変興味深い話ですので、じっくり読ませて頂こうと思います。 よろしければ続けて頂けると幸いです。
Lhankor_Mhy

2019/04/01 16:48

このあと、簡単なツリー構造を作って、appendChild がツリー構造を正しく保てるのは「子が親への参照を持っているから」を示す予定でしたが、また次の機会にでも。
WeilSpinor

2019/04/01 16:57

はい。ありがとうございました。
guest

0

maisumakun様があげられた、「オブジェクトの同一性判定」というキーワードをたどって、
JavaScript公式リファレンスにおいて「オブジェクトの取り扱い」を勉強する中で、
今回の一連の疑問を解決する糸口をつかむことができたので、報告いたします。
以下のリンクにて、
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects
「オブジェクトの比較」という項目を読む限り、
やはり私の予想の通り、

「インスタンスの生成プロセス」がカギだったみたいです。

生成のプロセス自体はブラックボックスですが、
どうやら内部では、
定義されたクラス(今回はclass div要素)のインスタンスを生成するときには、
インスタンスの生成宣言の度に、そのインスタンスにラベル付けのようなことが行われていて、
それをもってそのスレッド内の「クラスが同じインスタンス同士」の区別を行っていると思われます。

とりあえず、スッキリしてよかったです。

投稿2019/04/01 16:18

WeilSpinor

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/04/01 16:30

インスタンスの比較について言うなら、ここで書かれた「ラベル」を「メモリアドレス」だと思えば、大筋外してはいないです。 しかしながら、 > 原因はおそらく、上記のappendChildの仕様により、生成する毎に元あった箱が削除されているのではないか、と思われる の仮説は間違いなので > 私の仮説が正しければ、 > 「appendChildによって、毎回(2秒ごとに)、ノードの追加の前に、ノードの削除が行われている」 > つまり、 > 「同じファイル名のファイルを作成するとき、もともとあるファイルを削除してから作成する」 > みたいなことがされている、ということなので のあたりが完全に外しています。 そもそも比較もなにも、提示のコードではdivのハコは"ただ一つ"しかなくって、これがsetIntervalのたびに、wrapperに付け直されている(同じものを同じ親につけているので見た目かわらない)、ということです。
WeilSpinor

2019/04/01 16:48

ご返信ありがとうございます。 >> 「appendChildによって、毎回(2秒ごとに)、ノードの追加の前に、ノードの削除が行われている」 > つまり、 > 「同じファイル名のファイルを作成するとき、もともとあるファイルを削除してから作成する」 > みたいなことがされている、ということなので のあたりが完全に外しています。 付けなおしているんですか…。 これは、appendChildの仕様に、 「オブジェクトである親ノードの子ノードリストに指定したデータ属性(divなど)のノードを追加する。追加しようとしているノードが既に子ノードリストに存在する場合は、元あった同じノードを削除してから追加する」 といったことが書いてあったのですが、私は誤解しているんでしょうか…。 提示のコードではdivノードは"ただ一種類"しかない、というのは分かります。 そして、 「変数hakoに代入したdivノードを"コピーして"(参照して)、wrapperにappendChildしている」 という理解をしていました。 また落ち着いて考えたいと思います。
papinianus

2019/04/01 23:47

> 提示のコードではdivノードは"ただ一種類"しかない、 その1種類が1個しかないです。 その仕様のどこに(引数に入れられたものを)「コピー」(あるいは参照)すると書いてありますか?
WeilSpinor

2019/04/02 01:29 編集

コピーなどしないということは、 var hako = createElement(“div”); で中にdivノードが入った変数hakoは、 wrapper.appendChild(hako); を実行すると、 中身が無くなって空っぽ(undefined)になるんですか? 「変数hakoの中身を更新して空っぽにする」というところまで含めてappendChildの機能ということでしょうか? (もしそうでなければ、1行目の、var hako = createElement(“div”);で最初に作った変数hakoの中のはdivノードはずっと「存在し続ける」ことになりますね)
Lhankor_Mhy

2019/04/02 01:30 編集

違いますね。 私の回答読んでいただければ分かると思うのですが、変数hakoは、親要素を持たない div 要素を示していたが、.appendChild 実行後は、wrapper の子である div 要素を示すようになる、ということです。 そして、その両者は同じものである、ということです。 イメージ的には「追加」というより「移動」に近いです。
WeilSpinor

2019/04/02 01:36

なるほど、 それでpapinianusさまの仰っていた、 「拾っては投げ拾っては投げ、をしているに過ぎない」 という例え話に繋がっていくという感じですね。 たぶん分かりました。 ありがとうございます!????
WeilSpinor

2019/04/02 01:48 編集

「createElementで最初に作った金型であるdivを量産してwrapperに貼り付けている」 のではなく、 「createElementでただ一つだけ作ったdivを『wrapperの子ノードリスト』というデータベースに登録している」 ということですね。 データベースの大原則で、 「同じものを重複して登録できない」 から、登録作業はキャンセルされる。appendChildの場合は、それを便宜上「元あった方のレコードを消してから再登録する」ということでそれを実現している、という感じですね。 ようやく分かりました。ありがとうございます!????
Lhankor_Mhy

2019/04/02 01:54

> 「元あるものを消してから再登録する」 そうですね。 元の子ノードリストから消して、新しい親ノードの子ノードリストに再登録する。 (でも、ノード自体は消さない) という理解でいいんじゃないでしょうか。 その理解があれば、.removeChild() メソッドを実行しても要素が消えないことも、理解できると思います。
WeilSpinor

2019/04/02 02:07 編集

今思いついた例えですが、養子縁組に似ていると思いました。 生まれて(createElement)間もなくスラム街に捨てられた子供(div)は、親が不明で、戸籍上どの家庭にも属していない天涯孤独の身。 孤児院で生活しているとある日、ある夫婦(wrapper)が養子縁組を申し出てきた。 divは無事wrapper家引き取られ、wrapperの旦那はその日に役所で戸籍登録した。(appendChild) しかし後日、wrapper奥さんは、「まだdivの戸籍登録が済んでいない」と勘違いし、役所に行って登録作業をしたが、照会すると既に登録は済んでいたので、登録は無効になった。 どうでもいい話なので、返信は結構です。
Lhankor_Mhy

2019/04/02 02:12

日本の法律だと、「普通養子縁組」は実親との親子関係が切れませんからツリー構造ではないですね(やめろ)
guest

0

たとえ好きな質問者様だと記憶するので、比喩で回答します。

  • やりたいこと(の比喩)

黄色のカーペットの上にたち、(一穴)パンチに、赤い色紙をセットして、パンチを連打して、カーペットのうえに、赤い●をたくさんちりばめること

  • コードとの照合

黄色のカーペット=wrapper
パンチを打つ行為=createElement()の実行
赤=classname
パンチのカタチ="div"
繰り返すという行為=setInterval()

  • やっていること

黄色いカーペットのうえに、あらかじめ一穴パンチを一回押して作った●をひろってはなげ、ひろってはなげ、している

  • やろうとしていることとやっていることの乖離

ご自身がvar hakoと名付けているように、hakoは「四角く切り出された色紙」です。■です。決して、「パンチで新たな■を切り出そうとする行い」ではないです。
ばらまくかかりの人(setInterval)に、「新しい■」ではなく、最初に一回だけ切り出した■(hako)を(引数として、まさに)渡したうえで、それを、カーペット(wrapper)に(.)付けて(appendChild)くれといって、無限に増えないじゃないかと言われても、ばらまくかかりの人は、「いや、1個しかもらってませんし」という状態です。
kei344様の回答にあるように(勝手に引用してすみません)、ばらまくかかりの人には、材料と材料を使った新しい断片の切り出し方も教えてあげる必要があります。

投稿2019/04/01 14:05

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/04/01 16:24

ご回答ありがとうございます。 わぁ!とても分かりやすいたとえですね! createElementで■を調達して、 appendChildでパンチを打つ。 setIntervalは繰り返すという動作で…さすがです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問