JavaScriptでクリップボードにコピーするにはどうすればよいですか?


3322

テキストをクリップボードにコピーする最良の方法は何ですか?(マルチブラウザ)

私が試してみました:

function copyToClipboard(text) {
    if (window.clipboardData) { // Internet Explorer
        window.clipboardData.setData("Text", text);
    } else {  
        unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");  
        const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);  
        clipboardHelper.copyString(text);
    }
}

しかし、Internet Explorerでは、構文エラーが発生します。Firefoxでは、それは言うunsafeWindow is not definedます。

フラッシュなしの素晴らしいトリック:Trelloはユーザーのクリップボードにどのようにアクセスしますか?


好奇心旺盛ですが、クリップボードにコピーしてユーザーが自分でできないことは何ですか?
scunliffe 2008

233
特にない。彼らは自分でそれを行うことができますが、テキストの正しい部分を選択することを心配せずにボタンをクリックする可能性も提供したいと思います。
サンティアゴCorredoira 2008

4
この長いブログ投稿には、これを行うための多くの方法が含まれています。JavaScriptでシステムクリップボードにアクセスする–聖杯ですか?
アーロンDigulla

IEとFFでブラウザに未定義の例外が発生しています
Jagadeesh、2013

1
ユーザーのクリップボードにテキストを入れることができれば、彼のクリップボードを台無しにすることができます。
Frank Fang 2014年

回答:


2249

概観

クリップボードにコピーするための3つの主要なブラウザーAPIがあります。

  1. 非同期クリップボードAPI [navigator.clipboard.writeText]
    • Chrome 66(2018年3月)でテキストに焦点を当てた部分が利用可能
    • アクセスは非同期であり、JavaScript Promiseを使用します。セキュリティユーザープロンプト(表示されている場合)がページ内のJavaScriptを中断しないように記述できます。
    • テキストは変数から直接クリップボードにコピーできます。
    • HTTPS経由で提供されるページでのみサポートされます。
    • Chrome 66では、アクティブなタブのページは、権限のプロンプトなしでクリップボードに書き込むことができます。
  2. document.execCommand('copy')
    • ほとんどのブラウザーは、2015年4月現在、これをサポートしています(下記のブラウザーサポートを参照)。
    • アクセスは同期的です。つまり、セキュリティプロンプトの表示とユーザーインタラクションを含めて完了するまで、ページ内のJavaScriptを停止します。
    • テキストはDOMから読み取られ、クリップボードに配置されます。
    • 2015年4月までのテスト中、クリップボードへの書き込み中にアクセス許可のプロンプトが表示されるのはInternet Explorerのみでした。
  3. コピーイベントのオーバーライド
    • コピーイベントのオーバーライドについては、クリップボードAPIのドキュメントをご覧ください。
    • コピーイベントからクリップボードに表示される内容を変更できます。プレーンテキスト以外のデータ形式を含めることができます。
    • 質問に直接回答しないため、ここでは取り上げません。

一般的な開発メモ

コンソールでコードをテストしている間は、クリップボード関連のコマンドが機能することを期待しないでください。一般に、ページはアクティブである必要があります(非同期クリップボードAPI)、または(document.execCommand('copy'))がクリップボードにアクセスできるようにするには、ユーザーの操作(ユーザーがクリックするなど)が必要です。詳細については、以下を参照してください。

重要(ここに注記2020/02/20)

この投稿は元々クロスオリジンIFRAMEと他のIFRAMEの「サンドボックス化」でのアクセス許可の非推奨のため書かていたため、埋め込みデモの「コードスニペットの実行」ボタンと「codepen.ioの例」が一部のブラウザー(ChromeとMicrosoft Edgeを含む)で機能しないことに注意してください。)。

独自のWebページを作成するには、HTTPS接続を介してそのページを提供し、テストおよび開発します。

これは、コードが機能することを示すテスト/デモページです。https//deanmarktaylor.github.io/clipboard-test/

非同期+フォールバック

新しいAsync Clipboard APIのブラウザサポートのレベルにより、document.execCommand('copy')適切なブラウザカバレッジを取得するために、メソッドにフォールバックする必要がある場合があります。

これは簡単な例です(このサイトに埋め込まれていると機能しない可能性があります。上記の「重要な」注意をお読みください):

function fallbackCopyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  textArea.value = text;
  
  // Avoid scrolling to bottom
  textArea.style.top = "0";
  textArea.style.left = "0";
  textArea.style.position = "fixed";

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Fallback: Copying text command was ' + msg);
  } catch (err) {
    console.error('Fallback: Oops, unable to copy', err);
  }

  document.body.removeChild(textArea);
}
function copyTextToClipboard(text) {
  if (!navigator.clipboard) {
    fallbackCopyTextToClipboard(text);
    return;
  }
  navigator.clipboard.writeText(text).then(function() {
    console.log('Async: Copying to clipboard was successful!');
  }, function(err) {
    console.error('Async: Could not copy text: ', err);
  });
}

var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

(codepen.ioの例は機能しない可能性があります。上記の「重要な注意」をお読みください)このスニペットはStack Overflowの埋め込みプレビューではうまく機能しないことに注意してください:https ://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011

非同期クリップボードAPI

「権限をリクエスト」し、Chrome 66の権限APIを介してクリップボードへのアクセスをテストする機能があることに注意してください。

var text = "Example text to appear on clipboard";
navigator.clipboard.writeText(text).then(function() {
  console.log('Async: Copying to clipboard was successful!');
}, function(err) {
  console.error('Async: Could not copy text: ', err);
});

document.execCommand( 'copy')

この投稿の残りの部分では、document.execCommand('copy')APIのニュアンスと詳細について説明します。

ブラウザのサポート

JavaScriptのdocument.execCommand('copy')サポートが拡大しました。ブラウザーの更新については、以下のリンクを参照してください。

簡単な例

(このサイトに埋め込まれていると機能しない可能性があります。上記の「重要な」注意をお読みください)

var copyTextareaBtn = document.querySelector('.js-textareacopybtn');

copyTextareaBtn.addEventListener('click', function(event) {
  var copyTextarea = document.querySelector('.js-copytextarea');
  copyTextarea.focus();
  copyTextarea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
});
<p>
  <button class="js-textareacopybtn" style="vertical-align:top;">Copy Textarea</button>
  <textarea class="js-copytextarea">Hello I'm some text</textarea>
</p>

複雑な例:入力を表示せずにクリップボードにコピー

上記の簡単な例は、textareaまたはinput画面に要素が表示されて。

input/ textarea要素を表示せずにテキストをクリップボードにコピーしたい場合があります。これは、これを回避する方法の1つの例です(基本的に要素を挿入、クリップボードにコピー、要素を削除)。

Google Chrome 44、Firefox 42.0a1、Internet Explorer 11.0.8600.17814でテスト済み。

(このサイトに埋め込まれていると機能しない可能性があります。上記の「重要な」注意をお読みください)

function copyTextToClipboard(text) {
  var textArea = document.createElement("textarea");

  //
  // *** This styling is an extra step which is likely not required. ***
  //
  // Why is it here? To ensure:
  // 1. the element is able to have focus and selection.
  // 2. if element was to flash render it has minimal visual impact.
  // 3. less flakyness with selection and copying which **might** occur if
  //    the textarea element is not visible.
  //
  // The likelihood is the element won't even render, not even a
  // flash, so some of these are just precautions. However in
  // Internet Explorer the element is visible whilst the popup
  // box asking the user for permission for the web page to
  // copy to the clipboard.
  //

  // Place in top-left corner of screen regardless of scroll position.
  textArea.style.position = 'fixed';
  textArea.style.top = 0;
  textArea.style.left = 0;

  // Ensure it has a small width and height. Setting to 1px / 1em
  // doesn't work as this gives a negative w/h on some browsers.
  textArea.style.width = '2em';
  textArea.style.height = '2em';

  // We don't need padding, reducing the size if it does flash render.
  textArea.style.padding = 0;

  // Clean up any borders.
  textArea.style.border = 'none';
  textArea.style.outline = 'none';
  textArea.style.boxShadow = 'none';

  // Avoid flash of white box if rendered for any reason.
  textArea.style.background = 'transparent';


  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }

  document.body.removeChild(textArea);
}


var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

その他の注意事項

ユーザーがアクションを実行した場合にのみ機能します

すべてのdocument.execCommand('copy')呼び出しは、クリックイベントハンドラなどのユーザーアクションの直接の結果として行われる必要があります。これは、ユーザーが予期しないときにユーザーのクリップボードをいじるのを防ぐための手段です。

こちらのGoogle Developersの投稿をご覧くださいをご覧ください。

クリップボードAPI

完全なクリップボードAPIドラフト仕様は、https//w3c.github.io/clipboard-apis/にあります。

サポートされていますか?

  • document.queryCommandSupported('copy')trueコマンドが「ブラウザでサポートされている」場合に返されます。
  • そして、もし今呼び出されれば成功するならdocument.queryCommandEnabled('copy')戻ります。ユーザーが開始したスレッドからコマンドが呼び出され、他の要件が満たされていることを確認するためのチェック。truedocument.execCommand('copy')

ただし、ブラウザーの互換性の問題の例として、2015年4月から10月までのGoogle Chrome は、ユーザーが開始したスレッドからコマンドが呼び出された場合にのみ返さtruedocument.queryCommandSupported('copy')ます。

以下の互換性の詳細に注意してください。

ブラウザ互換性の詳細

/ にdocument.execCommand('copy')ラップされた単純な呼び出しの間trycatchユーザークリックの結果として呼び出されブロックで、最も互換性のある方法が得られますが、次の条件があります。

への呼び出しdocument.execCommanddocument.queryCommandSupportedまたは/ ブロックでdocument.queryCommandEnabled囲む必要があります。trycatch

ブラウザーの実装やブラウザーのバージョンが異なると、呼び出されると、返されるのではなく、異なるタイプの例外がスローされfalseます。

さまざまなブラウザーの実装はまだ流動的で、Clipboard APIはまだドラフトであるため、必ずテストを行ってください。


41
可変データ.IEから直接コピーする方法:var str = "word";
jscripter 2015

10
@BubuDaba <textarea>JSで非表示のダミーを作成し、に追加しdocument.body、その値を変数に設定し、のペースで使用しcopyTextarea、コンテンツがコピーされた直後に削除します。
SeinopSys 2015

3
SafariやSafariに実装されるインジケーターについて何かありますか?
www139

3
私が見つけた唯一のバージョンは、すべてのブラウザで動作します。これをBoostrap Modalで使用すると、テキスト領域をモーダルに追加する必要がありました。私があなたの解決策のためにできるなら、私は+1000を与えるでしょう!!! ありがとう!
Patrick

3
@AyaSalamaの重要な点は、ユーザーがアクションを実行しているブラウザに表示されない限り、「コピー」アクションを実行できないことです。要素が「display:none」でスタイル設定されている場合、ユーザーは要素を表示したり操作したりできないため、アクションを実行できません。
Dean Taylor

1257

クリップボードへの自動コピーは危険な場合があるため、ほとんどのブラウザー(IEを除く)では非常に困難です。個人的には、次の簡単なトリックを使用します。

function copyToClipboard(text) {
  window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
}

コピーするテキストがすでに選択されているプロンプトボックスが表示されます。Ctrl+ CEnter(ボックスを閉じる)-と押すだけで十分です!

ユーザーが手動で(ただし、かなり単純な方法で)行うため、クリップボードのコピー操作は安全です。もちろん、すべてのブラウザで動作します。

<button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>

<script>
  function copyToClipboard(text) {
    window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
  }
</script>


91
賢いですが、これは単一行のみをサポートします。
Aram Kocharyan、2011年

61
「プロンプト」機能をカスタムモーダルに変更するのは簡単です。トリックの要点は、編集可能なコンテンツフィールドを使用してテキストを事前に選択することです。また、ユーザーが自分自身をアクション。A ++
Jon z

110
まだjavascriptを使用せずにクリップボードにコピーしていません^ _ ^
RozzA

23
テキストが2000文字を超える場合は切り捨てられますが、小さなテキストサンプルの場合はうまく機能します
RasTheDestroyer

445
奇妙なことに、質問には答えませんが457の賛成票を獲得します。JavaScriptでクリップボードコピーしてください。
stevenvh 2013

300

次のアプローチは、Chrome、Firefox、Internet Explorer、Edge、およびSafariの最近のバージョンで機能します(コピーサポートは、2016年10月にリリースされたバージョン10で追加されました)。

  • textareaを作成し、その内容をクリップボードにコピーするテキストに設定します。
  • textareaをDOMに追加します。
  • テキストエリアでテキストを選択します。
  • document.execCommand( "copy")を呼び出す
  • domからtextareaを削除します。

注:textareaは、JavaScriptコードの同じ同期呼び出し内で追加および削除されるため、表示されません。

これを自分で実装する場合は、次の点に注意してください。

  • セキュリティ上の理由から、これはクリックなどのイベントハンドラーからのみ呼び出すことができます(ウィンドウを開く場合と同様)。
  • Internet Explorerは、クリップボードが初めて更新されたときに権限ダイアログを表示します。
  • Internet Explorer、およびEdgeは、textareaにフォーカスがあるとスクロールします。
  • execCommand()がスローする場合があります。
  • テキストエリアを使用しない限り、改行とタブが飲み込まれる可能性があります。(ほとんどの記事はdivの使用を推奨しているようです)
  • Internet Explorerダイアログが表示されている間、textareaは表示されます。それを非表示にするか、Internet Explorer固有のclipboardData APIを使用する必要があります。
  • Internet Explorerでは、システム管理者はクリップボードAPIを無効にできます。

以下の関数は、以下のすべての問題をできるだけきれいに処理する必要があります。問題を見つけた場合、または改善のための提案がある場合は、コメントを残してください。

// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
// Internet Explorer: The clipboard feature may be disabled by
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
function copyToClipboard(text) {
    if (window.clipboardData && window.clipboardData.setData) {
        // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
        return clipboardData.setData("Text", text);

    }
    else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
        var textarea = document.createElement("textarea");
        textarea.textContent = text;
        textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in Microsoft Edge.
        document.body.appendChild(textarea);
        textarea.select();
        try {
            return document.execCommand("copy");  // Security exception may be thrown by some browsers.
        }
        catch (ex) {
            console.warn("Copy to clipboard failed.", ex);
            return false;
        }
        finally {
            document.body.removeChild(textarea);
        }
    }
}

https://jsfiddle.net/fx6a6n6x/


9
いい答え:クロスブラウザーサポート、エラー処理+クリーンアップ。今日のqueryCommandSupportedの新しいサポートの時点で、クリップボードへのコピーがJavascriptで実行可能になり、厄介な 'window.prompt( "Copy to clipboard:Ctrl + C、Enter"、text)'回避策の代わりに、これが受け入れられる答えになるはずです。window.clipboardDataはIE9でサポートされているため、ブラウザーサポートリストにIE9を追加する必要があります。IE8以前もおそらくそうですが、確認する必要があります。
user627283

うん。IE 8/9は大丈夫です。私たちのアプリはそれらをサポートしていません。だから私はテストしていません。IEは1月にサポートを停止するので、あまり心配していません。うまくいけば、サファリのサポートがすぐに着陸するでしょう。それは彼らのレーダーにあると確信しています。
Greg Lowe、

4
@SantiagoCorredoira:2016年、これは受け入れられる答えになるに値します。BGT(大きな緑の目盛り)の再割り当てを検討してください。
Lawrence Dol

3
@Noitidartはテスト済みで、Firefox 54、Chrome 60、およびEdgeブラウザで完全に動作します。HTMLドキュメントにフォーカスがない場合でも、発生しているエラーはバージョンFF 55に固有です
Tosin John

2
@Noitidartそれはここでも完全に機能しますが、開発ツールに焦点を当てることは止めませんでした。ちなみに、通常のWebアプリユーザーが開発者ツールで実行すること
Tosin John

97

これが私の見解です...

function copy(text) {
    var input = document.createElement('input');
    input.setAttribute('value', text);
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
 }

@korayem:html inputフィールドを使用して\nも改行は考慮されず、テキストが1行にフラット化されることに注意してください。

コメントで@nikksanが述べたように、を使用textareaすると、次のように問題が修正されます。

function copy(text) {
    var input = document.createElement('textarea');
    input.innerHTML = text;
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
}

@nikksan文字列をコピーする方法は\n
sof-03

2
@ sof-03入力の代わりに\r\n
textareaを

1
Win10x64上のMicrosoft Edge 42.17134.1.0で動作しない
Honsa Stunna

3
私はあなたの答えをコピーしました。それはクロムで動作し、それが私が必要とするすべてです。
user875234 2018年

これは、Firefox v68.0.2(64ビット)で動作する最も簡単なソリューションです。
Arya

88

本当にシンプルなソリューション(統合に5分もかからない)が必要で、箱から出してすぐに見栄えが良い場合、Clippyは、いくつかのより複雑なソリューションの優れた代替手段です。

GitHubの共同創設者によって書かれました。以下のFlash埋め込みコードの例:

<object
   classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
   width="110"
   height="14"
   id="clippy">
  <param name="movie" value="/flash/clippy.swf"/>
  <param name="allowScriptAccess" value="always"/>
  <param name="quality" value="high"/>
  <param name="scale" value="noscale"/>
  <param NAME="FlashVars" value="text=#{text}"/>
  <param name="bgcolor" value="#{bgcolor}"/>
  <embed
     src="/flash/clippy.swf"
     width="110"
     height="14"
     name="clippy"
     quality="high"
     allowScriptAccess="always"
     type="application/x-shockwave-flash"
     pluginspage="http://www.macromedia.com/go/getflashplayer"
     FlashVars="text=#{text}"
     bgcolor="#{bgcolor}"/>
</object>

#{text}コピーする必要のあるテキストと#{bgcolor}色に置き換えることを忘れないでください。


12
興味のある方は、リポジトリのURLをコピーするときにGitHubでClippyが使用されていることを確認してください。
Radek、

66
ちなみに、GitHubでのClippyの使用はZeroClipboardに置き換えられました。
James M. Greene

219
OPはJavaScriptでのソリューションを求めていました。点滅しません。
MT。

21
@MT、「javascript」によって「ブラウザクライアント内」を意味する人もいます。したがって、JSのみが要件である可能性がありますが、この答えに出会う人の多くは、JSまたはその他広くサポートされているものを探しています。クライアント技術。Flashはすべてのプラットフォームに当てはまるわけではありませんが、クリップボードサポートなどの洗練された機能では、ポップアップダイアログ(確かにそうです)よりもUXが改善されれば、追加する価値があります。
Dave Dopson、2014年

13
現在、Flashに依存しているということは、Web開発を行っているほとんどすべての人に受け入れられない、一定の割合のサイト訪問者にとっては機能しないことを意味します。
jinglesthula 2016年

86

Webページからクリップボードを読み取って変更すると、セキュリティとプライバシーの問題が発生します。ただし、Internet Explorerでは可能です。私はこのスニペットの例を見つけました:

    <script type="text/javascript">
        function select_all(obj) {
            var text_val=eval(obj);
            text_val.focus();
            text_val.select();
            r = text_val.createTextRange();
            if (!r.execCommand) return; // feature detection
            r.execCommand('copy');
        }
    </script>
    <input value="http://www.sajithmr.com"
     onclick="select_all(this)" name="url" type="text" />


7
単純なコピー操作にフラッシュを使用するのはやり過ぎのように思えます。これを行うためのクリーンなJS方法があったことをうれしく思います。そして私達は企業環境にいるので。IEで問題ありません。ありがとうバンディ!
Eddie、

5
plz execCommand(\\’copy\\’);は、IEのクリップボードにコピーしないとどうなるかを説明しますか?@mrBorna
RozzA

20
使用しないでくださいif(!document.all)しかしif(!r.execCommand)、それをLEST誰でも他の道具!Document.allはこれとはまったく無関係です。
m93a

1
男、これは私がシンプルでクリーンなコードについて私が好きなものです、それはマイナーなメンテナンスでほとんど永久に機能します。これは私のためにそれをしました、それは美しく働きます。
サミュエル

1
最新の
Chrome

69

私は最近、この問題そのものについてテクニカルブログの投稿を書いています(私はLucidchartで働いており、最近、クリップボードのオーバーホールを行いました)。

プレーンテキストをクリップボードにコピーするのは、システムコピーイベント(ユーザーがCtrlCブラウザのメニューを押すかメニューを使用する)の間に行うことを前提として、比較的簡単です。

var isIe = (navigator.userAgent.toLowerCase().indexOf("msie") != -1 
           || navigator.userAgent.toLowerCase().indexOf("trident") != -1);

document.addEventListener('copy', function(e) {
    var textToPutOnClipboard = "This is some text";
    if (isIe) {
        window.clipboardData.setData('Text', textToPutOnClipboard);    
    } else {
        e.clipboardData.setData('text/plain', textToPutOnClipboard);
    }
    e.preventDefault();
});

システムコピーイベント中以外にテキストをクリップボードに書き込むのは、はるかに困難です。これらの他の回答のいくつかは、Flashを介してそれを行う方法を参照しているようです。これは、(私が理解している限り)ブラウザー間で唯一の方法です。

それ以外にも、ブラウザごとにいくつかのオプションがあります。

これはIEで最も単純なもので、JavaScriptから次の方法でいつでもclipboardDataオブジェクトにアクセスできます。

window.clipboardData

(ただし、システムの切り取り、コピー、または貼り付けイベントの外部でこれを実行しようとすると、IEはユーザーにWebアプリケーションのクリップボード権限を付与するように求めます。)

Chromeでは、クリップボードの権限を付与するChrome拡張機能を作成できます(これはLucidchartのために行っていることです)。次に、拡張機能がインストールされているユーザーは、システムイベントを自分で発生させる必要があります。

document.execCommand('copy');

Firefoxには、ユーザーが特定のサイトにクリップボードへのアクセスを許可するオプションいくつかあるようですが、私はこれらのいずれも個人的に試していません。


2
ブログの投稿には触れられていませんが(近いうちに更新したいと思っています)、execCommandを使用して切り取りとコピーをトリガーする機能があります。これは、IE10 +、Chrome 43 +、Opera29 +でサポートされています。それについてはこちらをお読みください。updates.html5rocks.com/2015/04/cut-and-copy-commands
Richard

これに関する問題は、他の通常のコピーイベントをハイジャックすることです。
ブロックアダムス

NB!このブラウザのスニッフィングは悪いです。スニッフィングを行います。IEの更新を困難にしています。
odinho-Velmont 2018

51

clipboard.jsは、Flash以外の小さなユーティリティで、テキストまたはHTMLデータをクリップボードにコピーできます。非常に使いやすく、.jsをインクルードして、次のようなものを使用するだけです。

<button id='markup-copy'>Copy Button</button>

<script>
document.getElementById('markup-copy').addEventListener('click', function() {
  clipboard.copy({
    'text/plain': 'Markup text. Paste me into a rich text editor.',
    'text/html': '<i>here</i> is some <b>rich text</b>'
  }).then(
    function(){console.log('success'); },
    function(err){console.log('failure', err);
  });

});
</script>

clipboard.jsもGitHubにあります

注:これは現在非推奨になっています。ここに移行します


このライブラリは、angular.ioがそのTour of Heroと、ユーザーがコピーする必要のある事前に選択されたテキストを表示することによってexecCommandをサポートしないブラウザーのグレースフルモードでフォールバックするために使用されます。
John-Philip

1
clipboard.jsは置き換えられたかフォークされたように見えますが、npmjs.com / package / clipboard
Joao

35

ZeroClipboardは、私が見つけた最高のクロスブラウザーソリューションです。

<div id="copy" data-clipboard-text="Copy Me!">Click to copy</div>    
<script src="ZeroClipboard.js"></script>
<script>
  var clip = new ZeroClipboard( document.getElementById('copy') );
</script>

iOSの非フラッシュサポートが必要な場合は、フォールバックを追加するだけです。

clip.on( 'noflash', function ( client, args ) {
    $("#copy").click(function(){            
        var txt = $(this).attr('data-clipboard-text');
        prompt ("Copy link, then click OK.", txt);
    });
});  

http://zeroclipboard.org/

https://github.com/zeroclipboard/ZeroClipboard


25
Flashとのクロスブラウザ?iOSおよびAndroid 4.4で動作しない
Raptor 2014年

1
更新された回答を参照してください。これにより、フラッシュユーザーの手順が少なくなり、他のすべてのユーザーのフォールバックが可能になります。
ジャスティン

8
10億行のコードがあります。それは絶対に嘲笑です。プロジェクトにそのようなモンスターを含めるよりも、まったく行わない方がよい
vsync '27 / 10/27

2
単純なバージョンgist.github.com/JamesMGreene/8698897があります。これは20Kで、74kバージョンにはすべての標準機能がありません。どちらもそれほど大きくありません。私の推測では、ほとんどのユーザーは74kまたは20kのファイルのダウンロードにかかる追加のミリ秒に問題がないため、コピー/貼り付けは2回ではなく1回のクリックです。
ジャスティン

@Justin例をコピーして貼り付けても、ローカルで機能させることはできません(srcスクリプトタグの値など、最小限の変更を行います)。彼らのドキュメントはかなりですが非効率的だと思います。
今村桂

29

2018年の取り組みは次のとおりです。

async copySomething(text?) {
  try {
    const toCopy = text || location.href;
    await navigator.clipboard.writeText(toCopy);
    console.log('Text or Page URL copied');
  }
  catch (err) {
    console.error('Failed to copy: ', err);
  }
}

それは私のようなAngular 6+コードで次のように使用されています:

<button mat-menu-item (click)="copySomething()">
    <span>Copy link</span>
</button>

文字列を渡すと、それがコピーされます。何もない場合は、ページのURLをコピーします。

クリップボードにもっと体操をすることもできます。詳細はこちら:

クリップボードアクセスのブロック解除


あなたはlocalhostにリンクしました
Joe Warner

2
これはSafari(バージョン11.1.2)では機能しないことに注意してください
arjun27

1
@ arjun27まあうまくいけばいつかアップルが追いつくでしょう。このcaniuse.com/#feat=clipboardは、前述のバージョンが部分的にサポートされていることを示しています。
KhoPhi 2018

2
私は両方の関数readText、writeTextを拒否状態のPromiseを取得しています
ramin

3
提供されたリンクによると、「navigator.clipboardはHTTPS経由で提供されるページでのみサポートされています」
TimH-Codidact

26

私が取り組んできたプロジェクトの1つである、ゼロクリップボードを利用するjQuery copy-to-clipboardプラグインライブラリ。

jQueryのヘビーユーザーである場合は、ネイティブのゼロクリップボードプラグインよりも使いやすいです。


6
92kbはそれほど大きなものではありません。高速で動作し、必要text()innerHTML()応じて使用できます
。– RozzA

17
@John:innerHTML長い間クロスブラウザをサポートしています。マイクロソフトが最初にアイデアを思いついたからといって、それが信頼性を欠いたり、独占したりすることはありません。また、ついに公式仕様に追加されました(すべての主要ブラウザベンダーがすでにサポートを追加した後... ため息)。
James M. Greene

19
@Johnあなたは、jQueryがFlashを使用する回答でJavaScriptが十分でないことに不満を言う;)
Max

4
ほとんどの場合、innerHTMLは他の方法よりも優れています。高い馬を降りろ!それはより速く、より効率的であり、ページの再レンダリングを必要としません。
エデンの周回軌道

4
@RozzA 92KBは本当に大きいです。LTEが成熟するまで、GPRSWWモバイルデータ標準であり、から始まり1 KB/sます。自分で計算してください。
Tino

23

Chrome 42以降とFirefox 41以降では、document.execCommand( 'copy')コマンドがサポートされるようになりました。だから私は、クロスブラウザのコピーからクリップボードへの機能のために、 Tim Downの以前の回答Google Developerの回答

function selectElementContents(el) {
    // Copy textarea, pre, div, etc.
    if (document.body.createTextRange) {
        // IE
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.select();
        textRange.execCommand("Copy");
    } 
    else if (window.getSelection && document.createRange) {
        // Non-Internet Explorer
        var range = document.createRange();
        range.selectNodeContents(el);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
        try {
            var successful = document.execCommand('copy');
            var msg = successful ? 'successful' : 'unsuccessful';
            console.log('Copy command was ' + msg);
        }
        catch (err) {
            console.log('Oops, unable to copy');
        }
    }
} // end function selectElementContents(el)

function make_copy_button(el) {
    var copy_btn = document.createElement('input');
    copy_btn.type = "button";
    el.parentNode.insertBefore(copy_btn, el.nextSibling);
    copy_btn.onclick = function() {
        selectElementContents(el);
    };

    if (document.queryCommandSupported("copy") || parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2]) >= 42) {
        // Copy works with Internet Explorer 4+, Chrome 42+, Firefox 41+, Opera 29+
        copy_btn.value = "Copy to Clipboard";
    }
    else {
        // Select only for Safari and older Chrome, Firefox and Opera
        copy_btn.value = "Select All (then press Ctrl + C to Copy)";
    }
}
/* Note: document.queryCommandSupported("copy") should return "true" on browsers that support copy
    but there was a bug in Chrome versions 42 to 47 that makes it return "false".  So in those
    versions of Chrome feature detection does not work!
    See https://code.google.com/p/chromium/issues/detail?id=476508
*/

make_copy_button(document.getElementById("markup"));
<pre id="markup">
  Text that can be copied or selected with cross browser support.
</pre>


これをまとめてくれてありがとう!コードに少し誤りがあります。「範囲」変数を2回定義しました(var range = document.createRange())。
Christian Engel

1
あなたは正しい@ChristianEngelです。2つ目は削除しました。どうやってそこに入ったのかはわかりません。
ジェフベイカー

23

私は(非常に成功し、これを使用することなく、 jQueryのまたは任意の他のフレームワーク)。

function copyToClp(txt){
    txt = document.createTextNode(txt);
    var m = document;
    var w = window;
    var b = m.body;
    b.appendChild(txt);
    if (b.createTextRange) {
        var d = b.createTextRange();
        d.moveToElementText(txt);
        d.select();
        m.execCommand('copy');
    } 
    else {
        var d = m.createRange();
        var g = w.getSelection;
        d.selectNodeContents(txt);
        g().removeAllRanges();
        g().addRange(d);
        m.execCommand('copy');
        g().removeAllRanges();
    }
    txt.remove();
}

警告

タブはスペースに変換されます(少なくともChromeでは)。


このアプローチではスペースが欠落しています
Bikram 2018

1
クロム。タブは1つのスペースに変換されます
Bikram

22

私は次の解決策を見つけました:

キーが押されたときにハンドラーが「pre」タグを作成します。このタグにコピーするコンテンツを設定してから、このタグで選択を行い、ハンドラーでtrueを返します。これは、chromeの標準ハンドラを呼び出し、選択されたテキストをコピーします。

また、必要に応じて、以前の選択を復元するための関数のタイムアウトを設定できます。Mootoolsへの私の実装:

   function EnybyClipboard() {
     this.saveSelection = false;
     this.callback = false;
     this.pastedText = false;

     this.restoreSelection = function() {
       if (this.saveSelection) {
         window.getSelection().removeAllRanges();
         for (var i = 0; i < this.saveSelection.length; i++) {
           window.getSelection().addRange(this.saveSelection[i]);
         }
         this.saveSelection = false;
       }
     };

     this.copyText = function(text) {
       var div = $('special_copy');
       if (!div) {
         div = new Element('pre', {
           'id': 'special_copy',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
       }
       div.set('text', text);
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         setTimeout(this.restoreSelection.bind(this), 100);
       } else return alert('Copy not work. :(');
     };

     this.getPastedText = function() {
       if (!this.pastedText) alert('Nothing to paste. :(');
       return this.pastedText;
     };

     this.pasteText = function(callback) {
       var div = $('special_paste');
       if (!div) {
         div = new Element('textarea', {
           'id': 'special_paste',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
         div.addEvent('keyup', function() {
           if (this.callback) {
             this.pastedText = $('special_paste').get('value');
             this.callback.call(null, this.pastedText);
             this.callback = false;
             this.pastedText = false;
             setTimeout(this.restoreSelection.bind(this), 100);
           }
         }.bind(this));
       }
       div.set('value', '');
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         div.focus();
         this.callback = callback;
       } else return alert('Fail to paste. :(');
     };
   }

使用法:

enyby_clip = new EnybyClipboard(); //init 

enyby_clip.copyText('some_text'); // place this in CTRL+C handler and return true;

enyby_clip.pasteText(function callback(pasted_text) {
        alert(pasted_text);
}); // place this in CTRL+V handler and return true;

貼り付けると、textareaが作成され、同じように機能します。

PSは、このソリューションを使用して、フラッシュなしで完全にクロスブラウザーのソリューションを作成できます。FFとChromeで動作します。


2
誰かがそれを試しましたか?さまざまなブラウザで実際に機能する場合は、気の利いたものに聞こえます。
マイケル

1
jsfiddle.net/H2FHCデモ:fiddle.jshell.net/H2FHC/show開いてCtrl + VまたはCtrl + Cを押してください。FF 19.0では完全に分岐します。Chrome 25.0.1364.97 mでも。Opera 12.14-OK。Safari 5.1.7 for Windows-OK。IE-失敗。
Enyby 2013

IEの場合、ページ内の要素にフォーカスを実行する必要があります。fiddle.jshell.net/H2FHC/3/showおよびfiddle.jshell.net/H2FHC/3 IE 9/10での作業を参照してください。document.createRangeがサポートされていないため、IE 6/7では別の方法でプロセス作成選択が必要です。
Enyby 2013

21

他のメソッドはプレーンテキストをクリップボードにコピーします。HTMLをコピーするには(つまり、結果をWSIWYGエディターに貼り付けることができます)、IEでのみ以下を実行できます。ブラウザが実際に目に見える形でコンテンツを選択するため、これは他の方法とは根本的に異なります。

// create an editable DIV and append the HTML content you want copied
var editableDiv = document.createElement("div");
with (editableDiv) {
    contentEditable = true;
}     
editableDiv.appendChild(someContentElement);          

// select the editable content and copy it to the clipboard
var r = document.body.createTextRange();
r.moveToElementText(editableDiv);
r.select();  
r.execCommand("Copy");

// deselect, so the browser doesn't leave the element visibly selected
r.moveToElementText(someHiddenDiv);
r.select();   

ここでは、より完全なHTMLのソリューションを参照してくださいstackoverflow.com/questions/34191780/...
kofifus

21

最高だと思うものをまとめました。

  • 直接スタイルを設定するのではなく、cssTextを使用してInternet Explorerの例外を回避します。
  • 選択があった場合、選択を復元します
  • モバイルデバイスでキーボードが表示されないように読み取り専用に設定します
  • iOSの回避策があるため、通常はexecCommandをブロックするように実際に機能します。

ここにあります:

const copyToClipboard = (function initClipboardText() {
  const textarea = document.createElement('textarea');

  // Move it off screen.
  textarea.style.cssText = 'position: absolute; left: -99999em';

  // Set to readonly to prevent mobile devices opening a keyboard when
  // text is .select()'ed.
  textarea.setAttribute('readonly', true);

  document.body.appendChild(textarea);

  return function setClipboardText(text) {
    textarea.value = text;

    // Check if there is any content selected previously.
    const selected = document.getSelection().rangeCount > 0 ?
      document.getSelection().getRangeAt(0) : false;

    // iOS Safari blocks programmtic execCommand copying normally, without this hack.
    // /programming/34045777/copy-to-clipboard-using-javascript-in-ios
    if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
      const editable = textarea.contentEditable;
      textarea.contentEditable = true;
      const range = document.createRange();
      range.selectNodeContents(textarea);
      const sel = window.getSelection();
      sel.removeAllRanges();
      sel.addRange(range);
      textarea.setSelectionRange(0, 999999);
      textarea.contentEditable = editable;
    }
    else {
      textarea.select();
    }

    try {
      const result = document.execCommand('copy');

      // Restore previous selection.
      if (selected) {
        document.getSelection().removeAllRanges();
        document.getSelection().addRange(selected);
      }

      return result;
    }
    catch (err) {
      console.error(err);
      return false;
    }
  };
})();

使用法: copyToClipboard('some text')


13

Flash 10以降、クリップボードにコピーできるのは、アクションがFlashオブジェクトとのユーザーインタラクションから発生した場合のみです。(AdobeのFlash 10発表の関連セクションをお読みください

解決策は、[コピー]ボタンの上にフラッシュオブジェクトを重ねるか、コピーを開始する要素です。ゼロクリップボードは現在、この実装で最高のライブラリです。経験豊富なFlash開発者は、独自のライブラリを作成したいだけかもしれません。


12

  <!DOCTYPE html>

  <style>
    #t {
      width: 1px
      height: 1px
      border: none
    }
    #t:focus {
      outline: none
    }
  </style>

  <script>
    function copy(text) {
      var t = document.getElementById('t')
      t.innerHTML = text
      t.select()
      try {
        var successful = document.execCommand('copy')
        var msg = successful ? 'successfully' : 'unsuccessfully'
        console.log('text coppied ' + msg)
      } catch (err) {
        console.log('Unable to copy text')
      }
      t.innerHTML = ''
    }
  </script>

  <textarea id=t></textarea>

  <button onclick="copy('hello world')">
    Click me
  </button>


最良の答え:D、次のようなものでそれを改善できます:#t {position:absolute; 左:0; z-index:-900; 幅:0px; 高さ:0px; ボーダー:なし。}これで完全に非表示になります!しかし、本当にありがとう!
フェデリコナバレテ2017年

#t {resize:none;}
SmartManoj 2017年

説明が正しいでしょう。
Peter Mortensen

12

私は次の解決策を見つけました:

非表示の入力にテキストがあります。setSelectionRange非表示の入力では機能しないため、一時的にタイプをテキストに変更し、テキストをコピーしてから、再び非表示にしました。要素からテキストをコピーする場合は、それを関数に渡し、その内容をターゲット変数に保存できます。

jQuery('#copy').on('click', function () {
    copyToClipboard();
});

function copyToClipboard() {
    var target = jQuery('#hidden_text');

    // Make it visible, so can be focused
    target.attr('type', 'text');
    target.focus();
    // Select all the text
    target[0].setSelectionRange(0, target.val().length);

    // Copy the selection
    var succeed;
    try {
        succeed = document.execCommand("copy");
    }
    catch (e) {
        succeed = false;
    }

    // Hide input again
    target.attr('type', 'hidden');

    return succeed;
}

11

HTML入力からクリップボードにテキストをコピーします。

 function myFunction() {
   /* Get the text field */
   var copyText = document.getElementById("myInput");

   /* Select the text field */
   copyText.select();

   /* Copy the text inside the text field */
   document.execCommand("Copy");

   /* Alert the copied text */
   alert("Copied the text: " + copyText.value);
 }
 <!-- The text field -->
 <input type="text" value="Hello Friend" id="myInput">

 <!-- The button used to copy the text -->
<button onclick="myFunction()">Copy text</button>

注: このdocument.execCommand()メソッドはInternet Explorer 9以前ではサポートされていません。

ソースW3Schools- テキストをクリップボードにコピー


11

すでに多くの答えがありますが、1つ(jQuery)を追加したいです。どのブラウザでも動作し、モバイルブラウザでも動作します(つまり、セキュリティに関するプロンプトが表示されますが、受け入れると問題なく動作します)。

function appCopyToClipBoard(sText)
{
    var oText = false,
        bResult = false;
    try
    {
        oText = document.createElement("textarea");
        $(oText).addClass('clipboardCopier').val(sText).insertAfter('body').focus();
        oText.select();
        document.execCommand("Copy");
        bResult = true;
    }
    catch(e) {
    }

    $(oText).remove();
    return bResult;
}

あなたのコードで:

if (!appCopyToClipBoard('Hai there! This is copied to the clipboard.'))
{
    alert('Sorry, copy to clipboard failed.');
}

9

これは、他の回答の組み合わせのビットです。

var copyToClipboard = function(textToCopy){
    $("body")
        .append($('<textarea name="fname" class="textToCopyInput"/>' )
        .val(textToCopy))
        .find(".textToCopyInput")
        .select();
      try {
        var successful = document.execCommand('copy');
        var msg = successful ? 'successful' : 'unsuccessful';
        alert('Text copied to clipboard!');
      } catch (err) {
          window.prompt("To copy the text to clipboard: Ctrl+C, Enter", textToCopy);
      }
     $(".textToCopyInput").remove();
}

jQueryを使用しますが、もちろんそうする必要はありません。必要に応じて変更できます。jQueryを自由に使えるようにしました。また、CSSを追加して、入力が表示されないようにすることもできます。たとえば次のようなもの:

.textToCopyInput{opacity: 0; position: absolute;}

またはもちろん、インラインスタイルを設定することもできます。

.append($('<textarea name="fname" style="opacity: 0;  position: absolute;" class="textToCopyInput"/>' )

変数データから直接コピーする方法.ie:var str = "word"; ?

可変メッセージは使用されていません
Voyager

textToCopy含まれている場合は'<textarea class = "textToCopyInput" /> </ textarea>'を使用する方が良い\n
Voyager

8

IE以外のブラウザでは、小さなフラッシュオブジェクトを使用してクリップボードを操作する必要があります。


これは今... GVSでの提案をチェックアウト古くなっ
Mottie

6
GvSの提案はフラッシュムービーを使用していますか?それは同じ考えではありませんか?
TheEmirOfGroofunkistan

8

(Excelなどの)カスタムグリッド編集の構築とExcelとの互換性で同じ問題が発生しました。複数のセルの選択、コピー、貼り付けをサポートする必要がありました。

解決策:ユーザーがコピーするデータを挿入するtextareaを作成し(ユーザーがセルを選択しているときは)、フォーカスを設定して(たとえば、ユーザーがを押すとCtrl)、テキスト全体を選択します。

したがって、ユーザーがCtrl+ Cを押すと、選択したセルがコピーされます。テスト後、textareaを1ピクセルにサイズ変更しただけです(display:noneで機能するかどうかはテストしていません)。すべてのブラウザでうまく動作し、ユーザーには透過的です。

貼り付け-これと同じようにすることができます(ターゲットによって異なります)-textareaに焦点を合わせ、onpasteを使用して貼り付けイベントをキャッチします(私のプロジェクトでは、セルのtextareasを使用して編集しています)。

例(商用プロジェクト)を貼り付けることはできませんが、アイデアはわかります。


7

clipboard.jsを使用しました。

npmで取得できます。

npm install clipboard --save

また、バウアーについて

bower install clipboard --save

使用法と例はhttps://zenorocha.github.io/clipboard.js/にあります


私はそれが動的なコンテンツとの互換性がなかったことを恐れていたが、それはある;-)私はそれが2008年の古いものよりも、今、よりよい解決策だと思う
ベナールパトリック


6

これは、@ Chaseの回答を拡張したものであり、IE9のDIVだけでなく、IMAGEおよびTABLE要素でも機能するという利点があります。

if (document.createRange) {
    // IE9 and modern browsers
    var r = document.createRange();
    r.setStartBefore(to_copy);
    r.setEndAfter(to_copy);
    r.selectNode(to_copy);
    var sel = window.getSelection();
    sel.addRange(r);
    document.execCommand('Copy');  // does nothing on FF
} else {
    // IE 8 and earlier.  This stuff won't work on IE9.
    // (unless forced into a backward compatibility mode,
    // or selecting plain divs, not img or table). 
    var r = document.body.createTextRange();
    r.moveToElementText(to_copy);
    r.select()
    r.execCommand('Copy');
}

5

私は質問を誤解しているようですが、参考のために、DOMの範囲を抽出し(クリップボードではなく、すべての最新ブラウザーと互換性があります)、oncopyおよびonpasteおよびonbeforepasteイベントと組み合わせて、クリップボードの動作を取得できます。これを実現するコードは次のとおりです。

function clipBoard(sCommand) {
  var oRange=contentDocument.createRange();
  oRange.setStart(startNode, startOffset);
  oRange.setEnd(endNode, endOffset);
/* This is where the actual selection happens.
in the above, startNode and endNode are dom nodes defining the beginning 
and end of the "selection" respectively. startOffset and endOffset are 
constants that are defined as follows:

END_TO_END: 2
END_TO_START: 3
NODE_AFTER: 1
NODE_BEFORE: 0
NODE_BEFORE_AND_AFTER: 2
NODE_INSIDE: 3
START_TO_END: 1
START_TO_START: 0

and would be used like oRange.START_TO_END */
      switch(sCommand) {
    case "cut":
          this.oFragment=oRange.extractContents();
      oRange.collapse();
      break;
    case "copy":
      this.oFragment=oRange.cloneContents();
      break;
    case "paste":
      oRange.deleteContents();
      var cloneFragment=this.oFragment.cloneNode(true)
      oRange.insertNode(cloneFragment);
      oRange.collapse();
      break;
  }
}

1
実際にコードを修正しました。すべてのブラウザで動作しますが、実際にはクリップボードにコピーされません。変数を介してコンテンツを抽出(カット)、クローン(コピー)するだけです。使い方を忘れてしまったようです。
mrBorna 2011

5

私の悪い。これはIEでのみ機能します。

次に、テキストをコピーする別の方法を示します。

<p>
    <a onclick="window.clipboardData.setData('text', document.getElementById('Test').innerText);">Copy</a>
</p>

9
これは、現在のChrome(V31)またはFireFox(v25)では機能しません。エラーは、window.clipboardDataが未定義であることです。プラス面では、IE9で動作します。したがって、良いブラウザを気にせず、悪いブラウザを使用するようにサイトをロックしたい限り、これはあなたがそれを行う方法です!
アンソニー

2
なぜそんなにばかげた答えをするのか分かりません。w3schools.com/howto/tryit.asp?filename=tryhow_js_copy_clipboard
Martian2049

5

これは、インターネット全体でさまざまな方法を調べた後、私がこれまでに作業した唯一のものでした。これは厄介なトピックです。世界中に多数のソリューションが投稿されており、それらのほとんどは機能しませ。これは私のために働きました:

注:このコードは、「onClick」メソッドのようなものへの直接同期コードとして実行された場合にのみ機能します。Ajaxへの非同期応答またはその他の非同期の方法で呼び出すと、機能しません。

copyToClipboard(text) {
    var copyText = document.createElement("input");
    copyText.type = "text";
    document.body.appendChild(copyText);
    copyText.style = "display: inline; width: 1px;";
    copyText.value = text;
    copyText.focus();
    document.execCommand("SelectAll");
    document.execCommand("Copy");
    copyText.remove();
}

このコードは1ピクセル幅のコンポーネントを画面上に1ミリ秒間目に見えるように表示しますが、心配しないでください。これは、他の人が実際の問題に対処できる問題です。


5

選択したテキスト(「コピーするテキスト」)をクリップボードにコピーするには、ブックマークレット(JavaScriptを実行するブラウザーブックマーク)を作成し、それを実行(クリック)します。一時的なテキストエリアを作成します。

GitHubのコード:

https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d

(function (text) {
  var node = document.createElement('textarea');
  var selection = document.getSelection();

  node.textContent = text;
  document.body.appendChild(node);

  selection.removeAllRanges();
  node.select();
  document.execCommand('copy');

  selection.removeAllRanges();
  document.body.removeChild(node);
})('Text To Copy');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.