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

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

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

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

1428閲覧

jqueryで要素を持たないテキストに要素を追加する方法

snof

総合スコア17

HTML5

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/03/14 05:59

編集2018/03/14 06:07

参考画像
イメージ説明

<div class="btn01"> <a href="./"> <div class="btn-in"> <span class="btn-icon"><i class="fas fa-flag"></i></span> テキスト </div> </a> </div>

jqueryで要素を持たない「テキスト」の部分に要素を追加し以下のようにする方法はありますか?

<span class="btn-icon"><i class="fas fa-flag"></i></span> <div class="btn-text">テキスト</div>

最後の行?に見えるのでlast-childで指定できないか、.wrapInnerでbtn-iconを指定して一緒に囲めないか試したのですが無理でした。

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

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

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

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

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

kei344

2018/03/14 06:02

teratailでは画像もアップできますので、ご自信で所持されている画像であればそちらを使用されてはいかがでしょうか。(画像として質問文に表示されますし)また、試されたコードも質問文に追記してください。
snof

2018/03/14 07:24

画像を追加できました。ありがとうございます。
guest

回答3

0

ベストアンサー

JavaScript

1$(".btn-in").contents().filter(function() { 2 return this.nodeType === Node.TEXT_NODE && this.textContent.replace(/\s/g, "").length > 0; 3}).wrap('<div class="btn-text">');

投稿2018/03/14 06:52

root_jp

総合スコア4666

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

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

snof

2018/03/14 07:24

完璧に動作できました。ありがとうございます。
guest

0

jQueryを使った方法は知らないけれど, 生のDOMを使って良いならこんな感じで.

JavaScript

1{ 2 const btn = document.querySelector(".btn-in>.btn-icon"); 3 const div = document.createElement("div"); 4 div.classList.add("btn-text"); 5 let node; 6 while(node = btn.nextSibling, node && node.nodeType == Node.TEXT_NODE){ 7 div.textContent += node.nodeValue; 8 node.remove(); 9 } 10 btn.parentNode.insertBefore(div, btn.nextElementSibling); 11}

基準となるノード(ここではbtn-iconクラスのノード)を基準に後続のノードを取得し, ノードがありかつそのノードがテキストノードの場合に新たに挿入するdiv要素にその中身をコピーします.


対象が複数あるならループで回すだけですよ.

JavaScript

1{ 2 const btns = document.querySelectorAll(".btn-in>.btn-icon"); 3 for(let i = 0, len = btns.length; i < len; i++){ 4 const btn = btns[i]; 5 const div = document.createElement("div"); 6 div.classList.add("btn-text"); 7 let node; 8 while(node = btn.nextSibling, node && node.nodeType == Node.TEXT_NODE){ 9 div.textContent += node.nodeValue; 10 node.remove(); 11 } 12 btn.parentNode.insertBefore(div, btn.nextElementSibling); 13 } 14}

投稿2018/03/14 06:29

編集2018/03/14 07:17
defghi1977

総合スコア4756

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

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

snof

2018/03/14 07:13

$(function() { const btn = document.querySelector(".btn-in>.btn-icon"); const div = document.createElement("div"); div.classList.add("btn-text"); let node; while(node = btn.nextSibling, node && node.nodeType == Node.TEXT_NODE){ div.textContent += node.nodeValue; node.remove(); } btn.parentNode.insertBefore(div, btn.nextElementSibling); }); jsファイルにこのように記載したところ、正常にタグが挿入されました。ただbtnが複数ある場合に最初の1つ目しか挿入されませんでしたのでdocument.querySelectorAllと書き換えてみましたがダメでした。説明不足で申し訳ありません。
defghi1977

2018/03/14 07:28

一応技術的にはどうとでもなりますが, メンテナンスを考えるとやはり静的にdiv要素を記述したほうがよかろうと思います.
guest

0

defghi1977さんとやっていることは似ていますが、
jQueryバージョンです。

javascript

1$(function(){ 2 3var targetDOM = $(".btn-in").eq(0); 4//一旦こ要素を変数に逃がす。 5var childrens = targetDOM.children(); 6 7// 一旦、子要素削除 8$(".btn-in").eq(0).children().remove(); 9// テキストを取得 10var textOnly = targetDOM.text(); 11 12// テキストも一旦削除 13targetDOM.empty(); 14 15// 改めて要素を入れていく 16targetDOM.append(childrens); 17targetDOM.append('<div class="btn-text">' + textOnly + '</div>'); 18 19});

いったん、子要素を変数に逃し、
子要素を消して、
テキストのみを抽出し変数に逃がし、削除、
改めて、親要素の中に、
子要素と、要素を追加したテキストを入れ込んでます。

投稿2018/03/14 06:42

編集2018/03/14 06:44
miyabi_takatsuk

総合スコア9528

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

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

snof

2018/03/14 07:16

ありがとうございます。試したところ、btnが複数ある場合に最初の一つしか適用されませんでした。説明不足で申し訳ありません。
miyabi_takatsuk

2018/03/14 07:31

であれば、.eq(0)を取れば、大丈夫かと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問