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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

522閲覧

JavaScriptで同じclass名を持つ要素を出し分けたい

J208U0JC0UWOJD9

総合スコア13

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/05/30 14:04

編集2019/06/01 00:43

JavaScript初心者です。
preタグ内をクリップボードにコピーできるボタンを作りました。

該当のソースコード

JavaScript

1<script> function pre() { 2 var copyText = document.querySelector('.aaa'); 3 var range = document.createRange(); 4 range.selectNode(copyText); 5 window.getSelection().addRange(range); 6 document.execCommand("Copy"); 7 alert("コピーしました"); 8} </script>

preタグ内にボタンを設置したため、ボタンはコピーされないようにaaaで囲った部分を対象としました。(pre内のbuttonだけコピーしない方法などあれば、聞いておきたいです。)

HTML

1<pre> 2<button onclick="pre()">コピーする</button> 3<span class="aaa"> 4ここにcodeを書く 5</span> 6</pre>

上記で、コピーボタンの設置や動作は上手くいったのですが、記事内にpreタグを複数設置した場合、一番上のaaaで囲った部分しかコピーされないことに気づきました。

同一classを使用したまま、個別にコピーできるようにするには、どうしたら良いでしょうか?
イメージ説明

個別にコピーという表現が分かりづらかったと思い、画像を追記しました。

「teratail」のように、囲ったpreタグそれぞれをコピーできるようにしたいと思っています。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

html

1<pre> 2<button>コピーする</button> 3<span class="aaa"> 4ここにcodeを書く 5</span> 6</pre> 7<pre> 8<button>コピーする</button> 9<span class="aaa"> 10ここにcodeを書く2 11</span> 12</pre> 13<pre> 14<button>コピーする</button> 15<span class="aaa"> 16ここにcodeを書く3 17</span> 18</pre>

javascript

1(function(){ 2document.querySelectorAll('pre').forEach((row)=>{ 3 row.querySelector('button').onclick = () =>{ 4 //alert(row.querySelector('.aaa').innerHTML); 5 let elm = document.createElement('textarea'); 6 elm.value = row.querySelector('.aaa').innerHTML; 7 document.body.appendChild(elm) ; 8 elm.select(); 9 document.execCommand("copy"); 10 document.body.removeChild(elm); 11 }; 12 13}); 14 15})();

投稿2019/05/30 15:18

編集2019/06/01 02:50
hentaiman

総合スコア6415

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

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

J208U0JC0UWOJD9

2019/06/01 01:24

hentaiman様 返信ありがとうございます。 分かりづらい表現をしてしまい、申し訳ありません。 質問に画像を追記致しました。 「teratail」の質問画面のように、複数のコード用ボックスを入れても それぞれをコピーできるようにしたいと思っています。 もしお分かりになるようでしたら、ご教授していただきたいと思います。 よろしくお願いします。
hentaiman

2019/06/01 02:39

コメントに合わせて回答変更しました コピー処理に関してはalertの部分を適当に改造してください
hentaiman

2019/06/01 02:50

やっぱコピー処理まで追加しておいたので参考にしてみてください
J208U0JC0UWOJD9

2019/06/01 23:08

hentaiman様 ご丁寧にありがとうございます。 実装してみたところ、上手くいきました。 ただ1点だけ、スマホでみた場合、コピーボタンを押すと一番下のフッターまで勝手にスクロールされてしまうのですが、こちらの原因は分かりますでしょうか? 何度も質問して申し訳ありません。 お時間のある時にお返事いただければと思います。 よろしくお願いします。
hentaiman

2019/06/02 00:59

コピーするためにテキストエリア追加して文字選択状態させてるんだけど、その時に画面のフォーカス行ってるんだと思うので、コピーの処理自体を作り直してみてください 同じ書き方でやるなら、elementにdisplaynoneにして押したボタンと同じ位置に追加すれば良い多分大丈夫
guest

0

HTMLとJavaScriptを少し変更することになります。

onClickで呼び出すときにthisを引数に指定します。

html

1<pre> 2<button onclick="pre(this)">コピーする</button> 3<span class="aaa"> 4ここにcodeを書く 5</span> 6</pre>

JavaScript側で指定された引数を利用します。

JavaScript

1function pre(srcObject) { 2 var copyText = srcObject.parentElement.querySelector('.aaa'); 3 var range = document.createRange(); 4 range.selectNode(copyText); 5 window.getSelection().addRange(range); 6 document.execCommand("Copy"); 7 alert("コピーしました"); 8}

でどうでしょうか?(他にもいろいろやる方法はあるかと思いますが、一つの方法かなと思います。)

投稿2019/05/31 08:53

JTera

総合スコア12

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

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

J208U0JC0UWOJD9

2019/06/01 01:17

JTera様 返信ありがとうございます。 試してみたところ、スマホではそれぞれのpreタグ内をコピーできました。ありがとうございます。 ただ、PC(Chrome環境)だと、最初にコピーした範囲のみ適用されます。 HTMLは以下のように書いています。 <pre> <button onclick="pre(this)">コピーする</button> <span class="aaa"> ここにcodeを書く </span> </pre> <pre> <button onclick="pre(this)">コピーする</button> <span class="aaa"> ここにcodeを書く2つ目 </span> </pre> <pre> <button onclick="pre(this)">コピーする</button> <span class="aaa"> ここにcodeを書く3つ目 </span> </pre> 例えば、3つ目のコピーボタンを最初に押した場合、その後1つ目や2つ目を押しても動作しない状態です。 もとの質問内容にも画像を追加しました。 もし何か原因がわかればご教授いただけたらと思います。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問