スポンサーリンク

HTML内にクリップボードへコピーボタンを作成

自サイト内のコードをコピペするときに、時々このコードをコピーボタンが恋しくなる。実装するにはどうすればいいのか調べた。JavaScriptでクリップボードにコピーするらしい。

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
  </head>
  <body>
    <div>
      <pre id="code1"><code>print("Hello, World!")</code></pre>
      <button onclick="copyToClipboard('code1')">コピー</button>
    </div>

    <div>
      <pre id="code2"><code>sudo apt-get update</code></pre>
      <button onclick="copyToClipboard('code2')">コピー</button> 
    </div>
    
    
    <script>
        // クリックすると呼び出される
        function copyToClipboard(elementId) {
            var codeBlock = document.getElementById(elementId); // preの中身全部が入る
            var range = document.createRange(); // ドキュメントの一部を選択する貯めのオブジェクトを作成
            range.selectNode(codeBlock);
            window.getSelection().removeAllRanges(); // 選択解除
            window.getSelection().addRange(range);   // 選択範囲に、codeBlockを追加済みのrangeオブジェクトを指定
            try {
                document.execCommand('copy');        // クリップボードへコピー
            } catch (err) {
                alert('コピー失敗');
            }
            window.getSelection().removeAllRanges();
        }
    </script>
  </body>
</html>

実行例

print("Hello, World!")
sudo apt-get update

code1とかが冗長な気がして調べたら、previousElementSiblingで、オブジェクトの一つ前のエレメントを取得できるらしい。

さらにnavigator.clipboard.writeTextでクリップボードに書き込めるので、だいぶシンプルになった。

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
  </head>
  <body>
    <div>
      <pre><code>print("Hello, World!")</code></pre>
      <button onclick="copyToClipboard(this)">コピー</button>
    </div>

    <div>
      <pre><code>sudo apt-get update</code></pre>
      <button onclick="copyToClipboard(this)">コピー</button> 
    </div>
    
    
    <script>
        // クリックすると呼び出される
        function copyToClipboard(elem) {
        
            var codeBlock = elem.previousElementSibling;                       // elem の前の要素を取得
            var codeText = codeBlock.innerText || codeBlock.textContent;       // elem からテキストを取得
            
            navigator.clipboard.writeText(codeText);  // テキストをクリップボードにコピー
            
        }
    </script>
  </body>
</html>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: