🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

5回答

7321閲覧

複数のdom 簡単にcreateElementする方法

Kimsehwa

総合スコア312

JavaScript

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

0グッド

2クリップ

投稿2019/10/28 16:08

<div class="ytp-scrubber-button ytp-swatch-background-color" style="background-color: #f87c7c; height: 13px;"> <div class="ytp-scrubber-pull-indicator"> </div> </div>

のようなDOMを作るには
現在以下のように作成してますが、

const addDiv = document.createElement('div'); addDiv.className = 'ytp-scrubber-button ytp-swatch-background-color'; addDiv.style = 'background-color: #f87c7c; height: 13px;'; const addDiv2 = document.createElement('div'); addDiv2.className = 'ytp-scrubber-pull-indicator'; addDiv.appendChild(addDiv2);

もうちょっと簡単に作る方法はありますでしょうか。

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

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

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

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

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

guest

回答5

0

template 要素でどんなに深くても簡単になります。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/template

HTML

1<template id="template"> 2 <div class="ytp-scrubber-button ytp-swatch-background-color" style="background-color: #f87c7c; height: 13px;"> 3 <div class="ytp-scrubber-pull-indicator"> 4 </div> 5 </div> 6</template>

JavaScript

1 const addDiv = document.getElementById('template').content.cloneNode(true);

投稿2019/10/30 09:14

x_x

総合スコア13749

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

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

0

オブジェクトのコピーを行うObject.assign()を利用すると属性付きエレメントの作成が簡潔に書けます。

js

1const addDiv = Object.assign(document.createElement('div'), 2 {className:'ytp-scrubber-button ytp-swatch-background-color', style:'background-color: #f87c7c; height: 13px;'}); 3const addDiv2 = Object.assign(document.createElement('div'), 4 {className:'ytp-scrubber-pull-indicator'}); 5addDiv.appendChild(addDiv2);

あとは、関数を別名にしたり、適当に関数にしてしまえばコード量は減りますが、後で見るときや他人が見るときの可読性に問題があるので、無闇に行うのはあまりおすすめしません。

js

1// 例1 2creEle = document.createElement 3// creEle('div') は document.createElement('div') と同じ 4 5// 例2 6creEle = (e, attr) => Object.assign(document.createElement(e), attr) 7// creEle('div', {id:'foo'}) は Object.assign(document.createElement('div'), {id:'foo'}) と同じ

投稿2019/10/28 17:33

kairi003

総合スコア1332

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

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

0

jQueryで言う、

javascript

1const domA = $(` 2 <div class="ytp-scrubber-button ytp-swatch-background-color" style="background-color: #f87c7c; height: 13px;"> 3 <div class="ytp-scrubber-pull-indicator"> 4 </div> 5 </div> 6`);

みたいなことをしたいとき、以下のようにDOMParserを使った関数を用意しておくという手がありますよ。

javascript

1const createElement = domString => new DOMParser().parseFromString(domString, 'text/html').body.firstChild; 2 3const domB = createElement(` 4 <div class="ytp-scrubber-button ytp-swatch-background-color" style="background-color: #f87c7c; height: 13px;"> 5 <div class="ytp-scrubber-pull-indicator"> 6 </div> 7 </div> 8`); 9

javascript

1console.log(domA[0].outerHTML === domB.outerHTML); 2//=> true

参考:
Using the DOM like a Pro
Create an element from raw HTML
https://itnext.io/using-the-dom-like-a-pro-163a6c552eba#1729

投稿2019/10/31 08:47

shinji709

総合スコア805

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

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

0

jQueryが使えるなら記述は分かりやすくはなります。
入れ子の構造も多少は分かりやすいです。
書き方にもよりますがコード量はあまり変わらないです。

javascript

1$('<div>', { 2 class: 'ytp-scrubber-button ytp-swatch-background-color', 3 css: { 4 'background-color': '#f87c7c', 5 height: 13 6 } 7}).append( 8 $('<div>', {class: "ytp-scrubber-pull-indicator"}) 9);

jQueryが使用できないのであればkairi003さんのやり方や関数を自作するとかでしょうか。
私もあまりお勧めはしませんが。

参考 createElementメソッドが微妙なので汎用的な関数にする

投稿2019/10/28 18:02

m.kagawa

総合スコア113

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

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

Kimsehwa

2019/10/29 08:47

jQueryから脱却中でしたが、こういうのはjQueryが楽ですよね、、
guest

0

質問の回答としては kairi003 さんの回答を推します。

DOMの動的な生成に関して小話:

JsonML てのもありました。

JsonmML

1["div", { 2 "className":"ytp-scrubber-button ytp-swatch-background-color" 3 , "style":"background-color: #f87c7c; height: 13px;" 4 } 5, ["div", { 6 "className":"ytp-scrubber-pull-indicator" 7 } 8 ] 9]

DOMに変換するときは、jsonml-html.js で以下のようにしてたはずです。

javasctipt

1JsonML.toHTML(string|array jml, function filter)

登場当時のブラウザでは爆速でDOM構築できたのですが…

フォーマットが JSON ですので、

  1. 公式でも JsonMLは HTMLよりもバイト数が増える
  2. 要素名を省略できない
  3. ダブルクォートも省略できない
  4. 上記のように整形して出力するユーティリティがない

と、デメリットが多すぎて、使う人が珍しい。

「JavaScript の Array は 添字指定で代入するのが push() より早い?」なんて言われていた遠い昔のことで、今では知らない人の多い方法論です。

投稿2019/10/30 09:01

編集2019/10/30 09:15
AkitoshiManabe

総合スコア5434

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問