Flash없이 클립 보드에 복사


90

클립 보드에 복사 할 수있는 많은 솔루션을 찾았지만 모두 플래시를 사용하거나 웹 사이트 측에서 사용할 수 있습니다. 플래시없이 자동으로 클립 보드에 메서드 복사를 찾고 있으며 사용자 측에서는 사용자 스크립트 및 물론 브라우저 간입니다.


아무것도 찾지 못했고 같은 것을 찾고 있습니다. 따라서 Flash를 사용하고 싶었습니까? 따라서이 기능을 생성하기 전에 제거했습니다.
eugeneK


1
FLASH를 사용하지 않으면 다양한 브라우저에서 수행 할 수 있을지 의심됩니다. 하지만이 솔루션을 얻을 수 있도록 할 수있는 구체적인 솔루션을 사용할 수있다 zeroclipboard
케쉬 Sankar

Rakesh- "구체적인 솔루션"은 Flash를 기반으로합니다. 내가 사용하는 브라우저에서는 작동하지 않습니다.
RobG

1
@wizztjh 방법 in stackoverflow.com/questions/400212/… @Rakesh zeroclipboard는 좋지만 Flash없이 완전히 방법을 찾고 싶습니다
Black_Sun

답변:


31

플래시 없이는 대부분의 브라우저에서 불가능합니다. 사용자의 클립 보드는 암호 또는 신용 카드 번호와 같은 항목을 포함 할 수 있으므로 보안 관련 리소스입니다. 따라서 브라우저는 당연히 자바 스크립트 액세스를 허용하지 않습니다 (일부는 사용자가 확인했음을 알리는 경고 메시지 또는 서명 된 자바 스크립트 코드를 허용하지만 그 중 어느 것도 크로스 브라우저가 아닙니다).


21
따라서 페이지는 클립 보드에서 읽을 수 없어야하지만 왜 쓰지 않는 것일까 요? = /
Ajedi32

5
그렇다면 사용자 알림 및 피드백이 전혀없는 숨겨진 플래시를 통해 이러한 일이 발생하도록 허용하는 이유는 무엇입니까?
Eric Grange

3
@EricGrange : 1990 년대 중반 Netscape의 누군가가 성능상의 이유로 브라우저 플러그인이 기본 바이너리가되어 거의 모든 작업을 수행 할 수 있다고 결정했기 때문입니다. 온라인 세계는 그 당시에는 훨씬 단순한 곳이었고 보안은 그다지 걱정되지 않았습니다.
마이클 Borgwardt

4
이 대답은 2011 년에 맞았지만 브라우저는 플래시를 죽이는 데 큰 도움이되었습니다. 아래 내 대답을 참조하십시오.
Hovis Biddle

25

나는 플래시 솔루션을 시도했지만 너무 좋아하지 않았습니다. 너무 복잡하고 너무 느립니다. 내가 한 일은 텍스트 영역을 만들고 여기에 데이터를 넣고 브라우저 "CTRL + C"동작을 사용하는 것이 었습니다.

jQuery 자바 스크립트 부분 :

// 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>

이제 복사 할 내용을 'PUT THE TEXT TO COPY HERE'에 입력하세요. 기능이 될 수 있습니다. ' 지역. 나를 위해 잘 작동합니다. 하나의 CTRL + C 조합을 만들어야합니다. 유일한 단점은 사이트에보기 흉한 텍스트 영역이 표시된다는 것입니다. style = "display : none"을 사용하면 복사 솔루션이 작동하지 않습니다.


6
이것은 Ctrl + C의 기능을 자바 스크립트 기능에 바인딩하고 OS 클립 보드에 데이터를 배치하지 않는 것 같습니다.
Ishmael

그게 바로 아이디어입니다. 브라우저 사본을 만드십시오. 유사한 솔루션이 있습니다 : knockoutjs.com/examples/clickCounter.html . 두 번 클릭하면 콘텐츠와 함께 javascript로 텍스트 영역이 생성됩니다.
Julio Saito

osx에서 나를 위해 작동하지 않았으므로 e.metaKeykeydown 비교에 추가 했지만 어떤 이유로 복사 작업이 트리거되지 않습니다. 이 바이올린을보십시오 : jsfiddle.net/gableroux/gta67/1
GabLeRoux

2
@GabLeRoux safari의 복사 기능은 텍스트가 선택된 경우에만 활성화됩니다. 이것은 이전에 작동했지만 최근 safari 업데이트로 인해 중지되었습니다. 키 다운 이벤트가 호출 된 후 텍스트를 선택해도 해당 브라우저에서 더 이상 텍스트가 잘리지 않는 것 같습니다. 그러나 크롬에서는 여전히 잘 작동합니다. 아 글쎄, .... 그냥 브라우저에서 플래시를 사용하여 다시 떨어질해야 할 수도 있습니다
아란 멀홀랜드

이렇게. (어떤 이유로 든) 볼 필요가없는 요소를 숨길 수없는 경우 padding-bottom : -1000과 같이 항상 시작에서 멀리 떨어 뜨릴 수 있습니다.
m3nda 2014



3

클립 보드 API 의 Xbrowser 지원을 참을성없이 기다리는 동안 ...


이것은 Chrome, Firefox, Edge, IE 에서 아름답게 작동합니다.

IE 는 사용자에게 클립 보드에 액세스하라는 메시지를 한 번만 표시합니다.
사파리 (글을 쓰는 시점에서 5.1) 을 지원하지 않습니다 execCommand에 대한copy/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"제가 테스트 한대로까지)의 한 구현되지 클립 보드 API를 . 즉, Chrome에서 클립 보드 이벤트를 읽으려고합니다.

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

throws : Uncaught TypeError : Illegal constructor

브라우저와 클립 보드 사이에서 발생 하는 믿을 수없는 혼란 에 대한 최고의 리소스는 여기 (caniuse.com)에서 볼 수 있습니다 (→ "Notes" 아래의 주석을 따르십시오 ).
MDN은 기본 지원이 모든 브라우저에 대해 "(예)" 라고 말합니다. 부정확 한 원인은 최소한 API가 작동 할 것으로 기대합니다.


1

HTML 페이지에 로컬 클립 보드를 사용할 수 있습니다. 이를 통해 HTML 페이지 내에서 콘텐츠를 복사 / 잘라 내기 / 붙여 넣기 할 수 있지만 타사 애플리케이션간에 또는 두 HTML 페이지 간에는 복사 할 수 없습니다.

다음은이를 수행하는 사용자 정의 함수를 작성하는 방법입니다 (Chrome 및 Firefox에서 테스트 됨).

여기입니다 뿐인 이 작업을 수행 할 수있는 방법을 보여줍니다.

참고 용으로 여기에 바이올린을 붙여 넣겠습니다.


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-08-09

우리는 elemnt 대신에 여기에 문자열을 전달 할 수
우다이 A. Navapara

이것은 당신이 같은 안에 있다는 것 window입니다. OS 및 다른 브라우저 탭에서 사용할 수 있는 실제 클립 보드아닙니다 . 또한 선택을 쉽게 할 사용 할 수 있습니다 select()단순히보다window.getSelection()
로코 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");

좋고 쉬운;)


링크
끊김
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.