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

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

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

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

jQuery

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

Q&A

解決済

1回答

1046閲覧

JS テキストコピーボタン、離れた位置にあるテキストをコピーしたい(複数設置)

crigw

総合スコア24

HTML5

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

jQuery

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

0グッド

0クリップ

投稿2020/02/05 01:07

編集2020/02/05 08:49

実現したいこと

指定範囲のテキストをコピーするボタンを作っているのですが、正常に動作しません。
・コピーボタンとテキストのセットは同ページ内に複数設置予定
・コピーボタンはタイトルcontentsPanel__unit__title内に設置
・コピーしたい対象テキストはcontentsPanel__unit__itemis-copyText部分

$(this).parents('.contentsPanel__unit__title').next('.contentsPanel__unit__item').find('.is-copyText');の記述部分次第だと考えているのですが、あれこれ試してもダメでした。

該当のソースコード

html

1<div class="contentsPanel__unit"> 2 <div class="contentsPanel__unit__title contentsPanel__unit__title--all modFlexBox"> 3 テキストエリア 4 <div class="modBtn"> 5 <button type="button" class="modBtn__item modBtn__item--secondary modBtn__item--xs is-copyBtn">コピー</button> 6 </div> 7 </div> 8 <div class="contentsPanel__unit__item"> 9 <textarea id="testCopy" class="modForm modForm--textarea is-copyText" placeholder="test test test" readonly></textarea> 10 </div> 11</div>

JS

1$(function(){ 2 window.addEventListener('load', function(){ 3 $('.is-copyBtn').on('click',function(){ 4 var textElem = $(this).parents('.contentsPanel__unit__title').next('.contentsPanel__unit__item').find('.is-copyText'); 5 window.getSelection().selectAllChildren(textElem[0]); 6 document.execCommand("copy"); 7 }); 8 }); 9});

試したこと

以下にすると正常にコピーされるのですが、
都度都度IDを追加していくのは不便なためできれば上記の様な指示で動作を実現したいです。

<div class="contentsPanel__unit"> <div class="contentsPanel__unit__title contentsPanel__unit__title--all modFlexBox"> テキストエリア <div class="modBtn"> <button type="button" onclick="copy()" class="modBtn__item modBtn__item--secondary modBtn__item--xs is-copyBtn">コピー</button> </div> </div> <div class="contentsPanel__unit__item"> <textarea id="testCopy" class="modForm modForm--textarea is-copyText" placeholder="tbsUQRZjaHf9p4iHHet3" readonly></textarea> </div> </div> $(function(){ function copy() { let text = document.getElementById('testCopy'); text.select(); document.execCommand('copy'); } });

###追記

<div class="contentsPanel"> <div class="contentsPanel__unit modFlexBox"> <div class="contentsPanel__unit__title">タイトル</div> <div class="contentsPanel__unit__item">XXX</div> </div> <div class="contentsPanel__unit"> <div class="contentsPanel__unit__title contentsPanel__unit__title--all modFlexBox"> テキストエリア <div class="modBtn"> <button type="button" class="modBtn__item modBtn__item--secondary modBtn__item--xs is-copyBtn">コピー</button> </div> </div> <div class="contentsPanel__unit__item"> <textarea id="testCopy" class="modForm modForm--textarea is-copyText" placeholder="test test test" readonly></textarea> </div> </div> <div class="contentsPanel__unit modFlexBox"> <div class="contentsPanel__unit__title">タイトル</div> <div class="contentsPanel__unit__item">XXX</div> </div> <div class="contentsPanel__unit modFlexBox"> <div class="contentsPanel__unit__title">タイトル</div> <div class="contentsPanel__unit__item">XXX</div> </div> <div class="contentsPanel__unit"> <div class="contentsPanel__unit__title contentsPanel__unit__title--all modFlexBox"> テキストエリア <div class="modBtn"> <button type="button" class="modBtn__item modBtn__item--secondary modBtn__item--xs is-copyBtn">コピー</button> </div> </div> <div class="contentsPanel__unit__item"> <textarea id="testCopy" class="modForm modForm--textarea is-copyText" placeholder="test test test" readonly></textarea> </div> </div> <div class="contentsPanel__unit"> <div class="contentsPanel__unit__title contentsPanel__unit__title--all modFlexBox"> テキストエリア <div class="modBtn"> <button type="button" class="modBtn__item modBtn__item--secondary modBtn__item--xs is-copyBtn">コピー</button> </div> </div> <div class="contentsPanel__unit__item"> <textarea id="testCopy" class="modForm modForm--textarea is-copyText" placeholder="test test test" readonly></textarea> </div> </div> </div>

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

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

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

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

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

azuapricot

2020/02/05 01:28

parents('.contentsPanel__unit').find('.is-copyText') ってやってもとれないですか?
crigw

2020/02/05 01:54

そちらでは動きませんでした…;;
tabuu

2020/02/05 02:00

試したことにある「onclick="copy()"」を「onclick="copy('testCopy')"」として、スクリプトにtextareaのIDを渡すのも面倒(不便)でしょうか?
x_x

2020/02/05 02:11

text.select(); をやめたのはなぜでしょうか?
yambejp

2020/02/05 02:50

コピーしたいテキストごとにボタンがあるという前提ですね? それらをdivなどで囲んでグルーピングされているなら 相対位置でとれますよ
Lhankor_Mhy

2020/02/05 03:06 編集

x_xさんがご指摘の通り、当方でも、text.select();なら動作しますね。(余分なロードイベントを外した上で)
crigw

2020/02/05 04:11 編集

>tabuuさん コピーしたいテキストの数が定まっていないため、IDでの制御だと不便になります… >x_xさん 前者と後者で参考にしたサイトの記述が違うためです。 >yambejpさん >コピーしたいテキストごとにボタンがあるという前提 こちらであっています。 なるほど、グルーピングすればいいのですね… ちなみにすみません、相対位置の記述はどう言う風にすればいいでしょうか… >Lhankor_Mhyさん 余分なロードイベントとはどこにあたる部分でしょうか。
Lhankor_Mhy

2020/02/05 04:31

余分なロードイベントとはこれです。 window.addEventListener('load', function(){
crigw

2020/02/05 08:50

>Lhankor_Mhyさん ご教示、ありがとうございます。 ですが、動きませんでした…;;
Lhankor_Mhy

2020/02/05 08:52

なるほど。 当方では動作しましたので、ご提示いただいていない部分に原因があるのだと思います。
crigw

2020/02/05 09:02

確認・参考のため、動作した記述内容を教えて頂けますでしょうか
crigw

2020/02/05 09:23

うごきました!ありがとうございます。 私側で動かなかったのは何を勘違いしたのか`var textElem = $(this).parents('.contentsPanel__unit__title').next('.contentsPanel__unit__item').find('.is-copyText');`を丸々削除してしまったためでした…
Lhankor_Mhy

2020/02/05 09:35

ご解決されて何よりです。
guest

回答1

0

ベストアンサー

相対位置

「.is-copyBtn」から「.is-copyText」までの相対位置は
提示のソースでいうと「.contentsPanel__unit」までさかのぼって探すとよいでしょう

投稿2020/02/05 04:13

yambejp

総合スコア116724

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

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

yambejp

2020/02/05 04:16

提示のソースだと .contentsPanel__unit__titleまでさかのぼり 次の.contentsPanel__unit__itemを取りに行っていますが グルーピングするならのその上の段階でやるわけです $('.is-copyBtn').on('click',function(){ $(this).closest('.contentsPanel__unit').find('.is-copyText')
crigw

2020/02/05 04:28

共同製作者に確認したところ、divなど追加してグルーピングをする方法が取れないことが判明しました… Vue(?)を用いて`.contentsPanel__unit`以下を繰り返し使うためと説明を受けました。 このHTMLソースのままに、位置を取得することは可能でしょうか?
yambejp

2020/02/05 04:33

ソースがvueならjQueryはやめたほうがよいです
crigw

2020/02/05 04:48

そうなんですね、担当者に相談してみます。 後学のため、HTMLソースそのままにコピーをする方法がありましたら一応教えて頂けますでしょうか。
crigw

2020/02/05 08:21

あらためて、VUEは使わないとのことですが、HTMLは変更しないでやれるならやりたいと言うことでした。
yambejp

2020/02/05 08:30

「.is-copyBtn」と「.is-copyText」の組み合わせが複数ある htmlのサンプルを提示できますか?
crigw

2020/02/05 08:50

サンプルを追記しました。
yambejp

2020/02/05 10:07

$(function(){ $('.is-copyBtn').on('click',function(){ var t=$(this).closest('.contentsPanel__unit__title').next('.contentsPanel__unit__item').find('textarea'); t.focus(); document.execCommand('copy'); }); });
crigw

2020/02/06 00:57

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問