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

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

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

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

Q&A

解決済

3回答

3103閲覧

jsでinsertBeforeを使用した要素移動のやり方が分かりません。

tokotoko2020

総合スコア3

JavaScript

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

0グッド

1クリップ

投稿2020/06/10 09:45

編集2020/06/10 10:30

いつもお世話になっています。
jsを勉強中ですが、難しくて教えて頂けたらと思います。

勉強のため、特定のクラス要素を別の要素内に移動させる処理を
バニラjsで書きたいと思っています。

jqueryだと以下のようになるのですが、
jsで書くにはどうすればいいのでしょうか?

html

1<div> 2 <p class="original-data">移動データ1</p> 3 <p>移動しない</p> 4 <p class="original-data">移動データ2</p> 5 <p>移動しない</p> 6 <p>移動しない</p> 7 <p class="original-data">移動データ3</p> 8 <p class="original-data">移動データ4</p> 9 <p class="original-data">移動データ5</p> 10</div> 11 12<div> 13 <span id="after-moving"></div> 14</div>

jquery

1$(function(){ 2 $('.original-data').insertBefore('#after-moving'); 3});

結果です

html

1<div> 2 <p>移動しない</p> 3 <p>移動しない</p> 4 <p>移動しない</p> 5</div> 6 7<div> 8 <p class="original-data">移動データ1</p> 9 <p class="original-data">移動データ2</p> 10 <p class="original-data">移動データ3</p> 11 <p class="original-data">移動データ4</p> 12 <p class="original-data">移動データ5</p> 13 <span id="after-moving"></div> 14</div>

失敗したコード

コチラはエラーが出てきてしまい処理が完了しませんでした

Uncaught DOMException: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.

html

1<div> 2 <p class="original-data">移動データ1</p> 3 <p>移動しない</p> 4 <p class="original-data">移動データ2</p> 5 <p>移動しない</p> 6 <p>移動しない</p> 7 <p class="original-data">移動データ3</p> 8 <p class="original-data">移動データ4</p> 9 <p class="original-data">移動データ5</p> 10</div> 11 12<div> 13 <span id="after-moving"></div> 14</div>

js

1let newNode = document.createElement('span'); 2let originalData = document.querySelectorAll('.original-data'); 3let afterMovingData = document.getElementById('after-moving').parentNode; 4for (i = 0, len = originalData.length; i < len; i++) { 5 afterMovingData.insertBefore(newNode , originalData[i]); 6}

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

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

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

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

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

miyabi_takatsuk

2020/06/10 10:05

なぜバニラに直そうと思ったのでしょう? 勉強のためですか?
退会済みユーザー

退会済みユーザー

2020/06/10 10:09

元のソースがどう動くかも書いてください。 そして、自分ではどう動くと思って、どう失敗したんでしょうか?
tokotoko2020

2020/06/10 10:13

miyabi_takatsuk はい。勉強の為です。現在、jqueryしか分からないので。。。
m.ts10806

2020/06/10 10:25

今起きてる問題を明記してください。 コードもらってできた!では、分かった気になるだけです。
miyabi_takatsuk

2020/06/10 10:33

> <span id="after-moving"></div> 閉じタグが、違いますね。 それが原因では?
guest

回答3

0

要素の操作なら、こっちの方が楽かも。

js

1document.querySelectorAll('.original-data').forEach( 2 e => document.getElementById('after-moving').insertAdjacentElement( 'beforebegin', e ) 3);

参考:
Element.insertAdjacentElement() - Web API | MDN

投稿2020/06/10 11:03

Lhankor_Mhy

総合スコア36158

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

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

tokotoko2020

2020/06/12 07:59

返事が遅くなりすいません。 ありがとうございます。やってみたところ出来ました。 各メソッドについては今後さらに勉強していきたいと思います。
guest

0

「同じ動作をするコード」なら以下です。
「同じ意味のコード」ではありません。DOM構造上、今回はたまたま結果が同じになります。

javascript

1document.getElementById('after-moving').parentElement 2 .prepend(...document.getElementsByClassName('original-data'));

厳密に同じ意味とするなら少し変わります。

javascript

1const target = document.getElementById('after-moving'); 2const parent = target.parentElement; 3document.querySelectorAll('.original-data') 4 .forEach(el => parent.insertBefore(el, target));

投稿2020/06/10 10:33

htsign

総合スコア870

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

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

tokotoko2020

2020/06/12 08:00

返事が遅くなりすいません。 ありがとうございます。 色々なアプローチがあるのですね。 勉強になりました。
guest

0

ベストアンサー

javascript

1const target = document.getElementById('after-moving'); 2const targetParent = target.parentNode; 3const datas = document.querySelectorAll('.original-data'); 4datas.forEach(elm => { 5 targetParent.insertBefore(elm, target); 6});

もっと簡略できるかもしれない。

ってわけで行数節約版

javascript

1const target = document.getElementById('after-moving'); 2document.querySelectorAll('.original-data').forEach(elm => { 3 target.parentNode.insertBefore(elm, target); 4});

(いや、もうちと簡略できるかもしれない)

エラーの原因

insertBeforeメソッドの使い方が間違っているからです。
移動したい要素の親.insertBefore(移動したい要素, 前に移動する時のターゲット);
という使い方です。
なので、質問者さんのコードを直すと下記になります。

javascript

1// 下記定義はいらない 2// let newNode = document.createElement('span'); 3let originalData = document.querySelectorAll('.original-data'); 4let afterMovingData = document.getElementById('after-moving').parentNode; 5for (i = 0, len = originalData.length; i < len; i++) { 6 afterMovingData.insertBefore(originalData[i], document.getElementById('after-moving')); 7}

投稿2020/06/10 10:19

編集2020/06/10 10:59
miyabi_takatsuk

総合スコア9528

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

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

miyabi_takatsuk

2020/06/10 10:22

こうやって見ると、これだけ行数の節約できるなんて、 やっぱjQueryは偉大な発明だと思います。
tokotoko2020

2020/06/12 08:05

返事が遅くなりすいません。 ありがとうございます。 間違えた箇所も説明していただき大変勉強になりました。 そうですね。jqueryはとても便利だという事が分かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問