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

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

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

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

jQuery

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

Q&A

解決済

2回答

984閲覧

jQueryで取得したオブジェクトの置き換え

rjunakc

総合スコア368

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/08/06 07:25

編集2019/08/06 09:04

前提・実現したいこと

jQueryで取得したオブジェクトの一部の要素を置き換えしたいです。
※以下は「bar1」を「bar2」に置き換えしたい場合です。

HTML

1<div class="hoge"> 2 <div class="foo"> 3 <input type="text" name="bar1" value=""> 4 <input type="text" name="bar1_text" value=""> 5 <textarea name="bar1_area"></textarea> 6 </div> 7</div> 8<a href="#" class="btn">複製</a>

このようなHTMLがあった場合に「複製」ボタンを押すと

HTML

1<div class="hoge"> 2 <div class="foo"> 3 <input type="text" name="bar1" value=""> 4 <input type="text" name="bar1_text" value=""> 5 <textarea name="bar1_area"></textarea> 6 </div> 7 <div class="foo"> 8 <input type="text" name="bar2" value=""> 9 <input type="text" name="bar2_text" value=""> 10 <textarea name="bar2_area"></textarea> 11 </div> 12</div> 13<a href="#" class="btn">複製</a>

となるようにしたいです。

試したこと

replaceメソッドを使ってみましたが、TypeErrorがでて動きませんでした。
同じものをコピーするまでは以下でできたのですが・・・

jQuery

1$('.btn').click(function(){ 2 var dom = $('.hoge .foo:last').clone(true); 3 dom.insertAfter('.hoge .foo:last'); 4 // 以下だとエラー 5 // dom.replace('bar1', 'bar2').insertAfter('.hoge .foo:last'); 6});

■エラーコード

Uncaught TypeError: dom.replace is not a function
at HTMLSpanElement.<anonymous> (hoge.php)
at HTMLSpanElement.dispatch (jquery.min.js:3)
at HTMLSpanElement.r.handle (jquery.min.js:3)

良い方法があれば、ご教授いただきたいです。
よろしくお願いします。

回答および質問ありがとうございました。
どちらの方法を採用するか、または参考にさせて頂いて解決するか現在はわかりませんので、先にご回答いただいた方をベストアンサーにさせて頂きました。
ありがとうございました。

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

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

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

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

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

m.ts10806

2019/08/06 07:28

cloneのほうはどうだったのでしょうか。
rjunakc

2019/08/06 07:30

早速ありがとうございます。 試したことの3行目は正常に動作して同じものが複製されています。 3行目をコメントアウトした5行目と入れ替えるとエラーで止まってしまいます。
m.ts10806

2019/08/06 07:42

それぞれエラー全文ご提示いただけますか?
rjunakc

2019/08/06 08:05

Uncaught TypeError: dom.replace is not a function at HTMLSpanElement.<anonymous> (hoge.php) at HTMLSpanElement.dispatch (jquery.min.js:3) at HTMLSpanElement.r.handle (jquery.min.js:3)
m.ts10806

2019/08/06 08:06

質問編集して追記いただければと
m.ts10806

2019/08/06 08:16

dom.insertAfter('.hoge .foo:last'); ↑こちらはエラー出てないのですか?
rjunakc

2019/08/06 08:53

エラーは出ていないです。
guest

回答2

0

地道に変換するしかないです

jQuery

1 dom.find('[name^="bar"]').each(function(_index, element) { 2 element.name = element.name.replace(/bar(\d+)/, function(_m, p) { 3 return 'bar' + (parseInt(p, 10) + 1).toString(); 4 }); 5 });

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace

-- 全属性対象版追記

jQuery

1 dom.find('*').each(function(_index, element) { 2 $.each(element.attributes, function(_index, attribute) { 3 element.setAttribute(attribute.name, attribute.value.replace(/bar(\d+)/, function(_m, p) { 4 return 'bar' + (parseInt(p, 10) + 1).toString(); 5 })); 6 }); 7 });

https://developer.mozilla.org/ja/docs/Web/API/Element/attributes

投稿2019/08/06 08:29

編集2019/08/06 08:51
x_x

総合スコア13749

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

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

rjunakc

2019/08/06 08:36

ありがとうございます。 「name^="bar"」以外にも「id=""」や「data-xxx=""」なども置き換えしたいのですが、そのパターン分ご提示のコードを書く必要がありますかね・・・やっぱり。
rjunakc

2019/08/06 08:59

ありがとうございます。 色々参考になりました。 もう一人の回答者の方の回答も参考にしながら、要件を満たすように作ってみます。 色々とご教授下さりありがとうございました。
guest

0

ベストアンサー

こんな感じで

javascript

1<script> 2$(function(){ 3 $('.btn').on('click',function(){ 4 var c=$('.hoge:eq(0)').clone(); 5 var bar='bar'+($('.hoge').length+1).toString(); 6 c.find('input:eq(0)').attr('name',bar).val(""); 7 c.find('input:eq(1)').attr('name',bar+'_text').val(""); 8 c.find('textarea').attr('name',bar+'_area').val(""); 9 $(this).before(c); 10 }); 11}); 12</script> 13 14<div class="hoge"> 15 <div class="foo"> 16 <input type="text" name="bar1" value=""> 17 <input type="text" name="bar1_text" value=""> 18 <textarea name="bar1_area"></textarea> 19 </div> 20</div> 21<a href="#" class="btn">複製</a> 22</script> 23

bar固定+数字を個別指定せずに処理

javascript

1<script> 2$(function(){ 3 $('.btn').on('click',function(){ 4 var c=$('.hoge:eq(0)').clone(); 5 var bar='bar'+($('.hoge').length+1).toString(); 6 c.find('[name]').filter(function(){ 7 return $(this).attr('name').match(/bar[0-9]+/); 8 }).each(function(){ 9 var name=$(this).attr('name'); 10 name=name.replace(/bar[0-9]+/,bar); 11 $(this).attr('name',name); 12 }); 13 $(this).before(c); 14 }); 15}); 16</script> 17 18<div class="hoge"> 19 <div class="foo"> 20 <input type="text" name="bar1" value=""> 21 <input type="text" name="bar1_text" value=""> 22 <input type="text" name="xxx_bar1_xxx" value=""> 23 <input type="text" name="dummy" value=""> 24 <textarea name="bar1_area"></textarea> 25 </div> 26</div> 27<a href="#" class="btn">複製</a> 28</script>

投稿2019/08/06 07:37

編集2019/08/06 08:43
yambejp

総合スコア114769

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

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

rjunakc

2019/08/06 08:08

回答ありがとうございます。 bar1を検索してbar2に一括で置き換えるような方法はないでしょうか。 質問用に簡単にしてありますが、もっとたくさん要素やinput以外に名前などもついているので・・・
yambejp

2019/08/06 08:11

いくらでもやりようはありますが、サンプルが足りません ・「bar」は固定でいいのか? ・bar1~bar9までだとして次はbar10なのか? ・bar1_hoge1のようにbarの直後以外に数値が入ることはないのか?
yambejp

2019/08/06 08:31

それと複製はあるけど、削除はないのですか?
rjunakc

2019/08/06 08:33

・barは固定で大丈夫です。 ・現在の使用方法では1~6までしか増やす予定はありません。もし9以降も増やすとして、10~で大丈夫です。 ・bar1の前後に文字が付くこと(xxx_bar1_xxx)はありますが、前後に数値が入ることや、それがインクリメントされることはないです。
rjunakc

2019/08/06 08:34

・削除は現在考えていません。
yambejp

2019/08/06 08:43

調整しました
rjunakc

2019/08/06 08:58

ありがとうございます。 色々参考になりました。 もう一人の回答者の方の回答も参考にしながら、要件を満たすように作ってみます。 色々とご教授下さりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問