Flashなしでクリップボードにコピー


90

私はクリップボードにコピーするための多くの解決策を見つけましたが、それらはすべてフラッシュを使用するか、ウェブサイト側のいずれかです。Flashを使用せずに自動的にクリップボードにメソッドをコピーする方法を探しています。ユーザー側の場合は、ユーザースクリプト用で、もちろんクロスブラウザ用です。


何も見つからず、同じものを探していました。Flashを使用したかったため、作成前にこの機能を削除しました。
eugeneK '06 / 06/15


1
FLASHを使用しないと、さまざまなブラウザで実行できるとは思えません。しかし、ソリューションのゼロクリップボード
Rakesh Sankar

Rakesh-「具体的なソリューション」はFlashに基づいています。私が使用するどのブラウザでも機能しません。
RobG

1
stackoverflow.com/questions/400212/の @wizztjhメソッドは、ユーザー側ではなくサイト側用です@Rakesh zeroclipboardは良いですが、Flashなしで完全にメソッドを見つけたい
Black_Sun

回答:


31

フラッシュがなければ、ほとんどのブラウザでは不可能です。ユーザーのクリップボードには、パスワードやクレジットカード番号などが含まれる可能性があるため、セキュリティ関連のリソースです。したがって、ブラウザはJavascriptへのアクセスを正しく許可しません(一部は、ユーザーが確認したことを示す警告または署名付きのJavascriptコードを許可しますが、クロスブラウザではありません)。


21
それで、ページがクリップボードから読み取れるべきではないかもしれませんが、それに書き込みませんか?= /
Ajedi32 2014

5
しかし、それでは、ユーザーへの通知やフィードバックがまったくない非表示のフラッシュを介してそれを実行できるようにするのはなぜですか。
エリックグランジ

3
@EricGrange:1990年代半ばに戻ると、Netscapeの誰かがパフォーマンス上の理由から、ブラウザプラグインはネイティブバイナリであり、したがってほとんど何でもできると判断しました。オンラインの世界は当時は非常に単純な場所であり、セキュリティはそれほど心配されていませんでした。
Michael Borgwardt 2014

4
この答えは2011年に真実でしたが、ブラウザはフラッシュを殺すための戦いにおいて大きな道を歩んできました。以下の私の答えを見てください。
Hovis Biddle 2015

25

フラッシュソリューションを試してみましたが、あまり好きではありませんでした。複雑すぎて遅すぎる。私がしたことは、textareaを作成し、そこにデータを入れて、ブラウザーの「CTRL + C」の動作を使用することでした。

jQuery JavaScript部分:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

HTML部分:
<textarea id="textArea1"></textarea>

次に、コピーする内容を「ここにコピーするテキストを入力してください」に入力します。機能することができます。範囲。私にとってはうまくいきます。CTRL + Cの組み合わせを1つ作成するだけです。唯一の欠点は、サイトに醜いテキストエリアが表示されることです。style = "display:none"を使用すると、コピーソリューションは機能しません。


6
これはCtrl + Cの関数をJavaScript関数にバインドするだけで、OSクリップボードにデータを配置しないようです。
イシュマエル

確かに、それはアイデアです。ブラウザのコピーを作成してください。ここにも同様のソリューションがあります:knockoutjs.com/examples/clickCounter.html。ダブルクリックすると、コンテンツを含むJavaScriptによってテキスト領域が作成されます。
Julio Saito

私はosxでは機能しなかったのでe.metaKey、キーダウン比較に追加しましたが、何らかの理由で、コピーアクションがトリガーされません。このフィドルを参照してください:jsfiddle.net/gableroux/gta67/1
GabLeRoux

2
@GabLeRouxサファリのコピー機能は、テキストが選択されている場合にのみ有効になります。これは以前は機能していましたが、Safariの更新により最近停止しました。キーダウンイベントが呼び出された後にテキストを選択しても、そのブラウザーではテキストがカットされないようです。ただし、Chromeでは問題なく動作します。まあ、そのブラウザのためだけにフラッシュを使用するようにフォールバックする必要があるかもしれません...
Aran Mulholland 2013年

このような。(何らかの理由で)表示する必要のない要素を非表示にできない場合、padding-bottom:-1000のように、いつでも最初から遠くに置くことができます。
m3nda 2014年


10

ついに登場!(SafariまたはIE8をサポートしていない限り... -_-)

Flashなしでクリップボードアクションを実際に処理できるようになりました。関連ドキュメントは次のとおりです。

https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand

https://developers.google.com/web/updates/2015/04/cut-and-copy-commands?hl=en

https://msdn.microsoft.com/en-us/library/hh801227%28v=vs.85%29.aspx#copy


3

一方で待ちかねのXbrowserをサポートするためにクリップボードAPI ...


これはChrome、Firefox、Edge、IEで美しく 機能します

IEは、クリップボードへのアクセスをユーザーに1回だけ要求します。
Safari(執筆時点では5.1)execCommandcopy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

すべてのブラウザー("plain/text"私がテストした限りMIMEタイプのみを処理できるFirefoxを除く)は、クリップボードAPIを実装していません。つまり、Chromeでクリップボードイベントを読み取ろうとして

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

throws:Uncaught TypeError:Illegalコンストラクタ

ブラウザとクリップボードの間で起こっている信じられないほどの混乱の最良のリソースは、ここ(caniuse.com)で見ることができます(→ 「メモ」の下のコメントに従ってください)。
MDNによると、基本的なサポートはすべてのブラウザーで「(はい)」であり、少なくともAPIが機能することを期待しているため不正確です。


1

HTMLページにローカルなクリップボードを使用できます。これにより、HTMLページ内でコンテンツをコピー/切り取り/貼り付けできますが、サードパーティのアプリケーションとの間、または2つのHTMLページ間ではできません。

これは、これを行うカスタム関数を作成する方法です(ChromeおよびFirefoxでテスト済み)。

これは、これを行う方法を示すFIDDLEです。

参考のためにここにもフィドルを貼り付けます。


HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();

mtBronaさん、こんにちは。これにjsfiddleを付ける方法はありますか?それをアクティブ化できないようです
neoswf 2013

elemntの代わりにここに文字列を渡すことができますか
Uday A. Navapara

これはあなたが同じ中にいる場合にのみ機能しますwindow。これは、OSおよび別のブラウザタブで使用できる実際のクリップボードではありません。また、選択はselect()単純に行うよりも簡単に行うことができますwindow.getSelection()
Roko C. Buljan

0

document.execCommand('copy')あなたがしたいことをします。しかし、このスレッドには、問題なく直接使用できる例はなかったので、ここに示します。

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')

-2

回避策はありません。フラッシュを使用する必要があります。フラッシュ(swf)ファイルを使用してブラウザー間のコピーと貼り付けを提供するjquery.copyと呼ばれるJQueryプラグインがあります。これは、私のブログの構文ハイライターが機能する方法に似ています。

jquery.copy.jsファイルを参照すると、データをクリップボードにプッシュするために必要なことはすべて次のようになります。

$.copy("some text to copy");

素敵で簡単です;)


リンクが壊れています(ファイルはダウンロードできなくなります)
SeinopSys
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.