実現したいこと
指定範囲のテキストをコピーするボタンを作っているのですが、正常に動作しません。
・コピーボタンとテキストのセットは同ページ内に複数設置予定
・コピーボタンはタイトルcontentsPanel__unit__title内に設置
・コピーしたい対象テキストはcontentsPanel__unit__item内is-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>
parents('.contentsPanel__unit').find('.is-copyText') ってやってもとれないですか?
そちらでは動きませんでした…;;
試したことにある「onclick="copy()"」を「onclick="copy('testCopy')"」として、スクリプトにtextareaのIDを渡すのも面倒(不便)でしょうか?
text.select(); をやめたのはなぜでしょうか?
コピーしたいテキストごとにボタンがあるという前提ですね?
それらをdivなどで囲んでグルーピングされているなら
相対位置でとれますよ
x_xさんがご指摘の通り、当方でも、text.select();なら動作しますね。(余分なロードイベントを外した上で)
>tabuuさん
コピーしたいテキストの数が定まっていないため、IDでの制御だと不便になります…
>x_xさん
前者と後者で参考にしたサイトの記述が違うためです。
>yambejpさん
>コピーしたいテキストごとにボタンがあるという前提
こちらであっています。
なるほど、グルーピングすればいいのですね…
ちなみにすみません、相対位置の記述はどう言う風にすればいいでしょうか…
>Lhankor_Mhyさん
余分なロードイベントとはどこにあたる部分でしょうか。
余分なロードイベントとはこれです。
window.addEventListener('load', function(){
>Lhankor_Mhyさん
ご教示、ありがとうございます。
ですが、動きませんでした…;;
なるほど。
当方では動作しましたので、ご提示いただいていない部分に原因があるのだと思います。
確認・参考のため、動作した記述内容を教えて頂けますでしょうか
うごきました!ありがとうございます。
私側で動かなかったのは何を勘違いしたのか`var textElem = $(this).parents('.contentsPanel__unit__title').next('.contentsPanel__unit__item').find('.is-copyText');`を丸々削除してしまったためでした…
ご解決されて何よりです。
回答1件
あなたの回答
tips
プレビュー