JavaScript로 클립 보드에 복사하는 방법


3319

텍스트를 클립 보드에 복사하는 가장 좋은 방법은 무엇입니까? (멀티 브라우저)

나는 시도했다 :

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

233
특별한 것은 없습니다. 그들은 스스로 할 수 있지만 올바른 텍스트 부분을 선택하는 것에 대해 걱정하지 않고 버튼을 클릭 할 수있는 가능성을 제공하고 싶습니다.
Santiago Corredoira

4
이 긴 블로그 게시물에는 다음과 같은 여러 가지 방법이 있습니다. JavaScript로 시스템 클립 보드에 액세스 – 성배?
Aaron Digulla

IE와 FF에서 브라우저에 정의되지 않은 예외가 발생합니다.
Jagadeesh

1
텍스트를 사용자의 클립 보드에 넣을 수 있다면 그의 클립 보드를 망칠 수 있습니다.
Frank Fang

답변:


2243

개요

클립 보드에 복사하기위한 세 가지 기본 브라우저 API가 있습니다.

  1. 비동기 클립 보드 API [navigator.clipboard.writeText]
    • Chrome 66 에서 제공되는 텍스트 중심 부분 (2018 년 3 월)
    • 액세스는 비동기식이며 JavaScript Promises를 사용 하므로 보안 사용자 프롬프트 (표시되는 경우)가 페이지의 JavaScript를 방해하지 않도록 작성할 수 있습니다.
    • 변수에서 직접 텍스트를 클립 보드로 복사 할 수 있습니다.
    • HTTPS를 통해 제공되는 페이지에서만 지원됩니다.
    • Chrome 66에서 활성 탭의 페이지는 권한 프롬프트없이 클립 보드에 쓸 수 있습니다.
  2. document.execCommand('copy')
    • 대부분의 브라우저는 2015 년 4 월 ~ 현재이를 지원합니다 (아래 브라우저 지원 참조).
    • 액세스는 동 기적입니다. 즉, 표시 및 사용자가 보안 프롬프트와 상호 작용하는 것을 포함하여 완료 될 때까지 페이지에서 JavaScript를 중지합니다.
    • DOM에서 텍스트를 읽고 클립 보드에 배치합니다.
    • ~ 2015 년 4 월 ~ 테스트 동안 클립 보드에 쓰는 동안 Internet Explorer 만 권한 프롬프트를 표시하는 것으로 나타났습니다.
  3. 복사 이벤트 재정의
    • 복사 이벤트 재정의에 대한 클립 보드 API 설명서를 참조하십시오 .
    • 복사 이벤트에서 클립 보드에 표시되는 내용을 수정하고 일반 텍스트 이외의 다른 형식의 데이터를 포함 할 수 있습니다.
    • 질문에 직접 대답하지 않으므로 여기에서 다루지 않습니다.

일반적인 개발 노트

콘솔에서 코드를 테스트하는 동안 클립 보드 관련 명령이 작동하지 않아도됩니다. 일반적으로 페이지가 활성화되어 있거나 (Async Clipboard API) 클립 보드 document.execCommand('copy')에 액세스 할 수 있도록 사용자 상호 작용 (예 : 사용자 클릭)이 필요합니다 ( 자세한 내용은 아래 참조).

중요 (여기에서 2020/02/20으로 표시)

이 게시물은 원래 교차 출처 IFRAME 및 기타 IFRAME "샌드 박스" 에서 권한이 더 이상 사용되지 않기 때문에 임베디드 데모 "Run code snippet"버튼 및 "codepen.io example"이 일부 브라우저 (Chrome 및 Microsoft Edge 포함)에서 작동하지 못하게합니다. ).

자체 웹 페이지를 개발하려면 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요소 를 표시하지 않고 클립 보드에 텍스트를 복사 할 수 있습니다 . 이 문제를 해결하는 방법의 한 예입니다 (기본적으로 요소 삽입, 클립 보드에 복사, 요소 제거).

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 개발자 게시물 을 참조하십시오.

클립 보드 API

전체 클립 보드 API 초안 사양은 https://w3c.github.io/clipboard-apis/ 에서 확인할 수 있습니다.

지원됩니까?

  • document.queryCommandSupported('copy')true"브라우저에서 지원하는"명령이면 반환 해야합니다.
  • document.queryCommandEnabled('copy')반환 true(가) 경우 document.execCommand('copy')지금이라고하면 성공합니다. 사용자 시작 스레드에서 명령이 호출되었고 다른 요구 사항이 충족되는지 확인

그러나 브라우저 호환성 문제의 예로, ~ 4 월에서 ~ 10 월 2015까지 Chrome 은 명령이 사용자 시작 스레드에서 호출 된 경우 에만 반환 true되었습니다 document.queryCommandSupported('copy').

아래의 호환성 세부 사항에 유의하십시오.

브라우저 호환성 세부 사항

사용자 클릭의 결과로 호출 document.execCommand('copy')try/ catch블록 으로 래핑 된 간단한 호출 은 당신에게 가장 호환성을 제공하지만 다음과 같은 조항이 있습니다.

어느 전화 document.execCommand, document.queryCommandSupported또는이 document.queryCommandEnabledA의 포장되어야한다 try/ catch블록.

서로 다른 브라우저 구현과 브라우저 버전은 return 대신에 호출 될 때 다른 유형의 예외를 발생 false시킵니다.

다른 브라우저 구현은 여전히 ​​유동적이며 클립 보드 API 는 아직 초안이므로 테스트를 수행해야합니다.


41
변수 데이터에서 직접 복사하는 방법 var str = "word";.
jscripter

10
@BubuDaba <textarea>JS로 숨겨진 더미를 작성하고 에 추가 document.body하고 값을 변수에 설정 copyTextarea한 다음 속도로 사용 하고 내용을 복사 한 직후에 제거하십시오.
SeinopSys

3
Safari 또는 Safari에서 구현 될 지표가 있습니까?
www139

3
내가 찾은 유일한 버전은 모든 브라우저에서 작동합니다. Boostrap Modal에서 이것을 사용할 때 텍스트 영역을 모달에 추가해야한다는 것을 알았습니다. 솔루션을 얻을 수 있다면 +1000을 줄 것입니다 !!! 감사!
Patrick

3
@AyaSalama 요점은 사용자가 조치를 취하는 브라우저에 "복사"조치가 나타나지 않으면 수행 할 수 없다는 것입니다. 요소가 "display : none"으로 스타일이 지정되어 있으면 해당 요소를 보거나 상호 작용할 수 없으므로 조치를 취할 수 없습니다.
Dean Taylor

1256

클립 보드로 자동 복사하는 것은 위험 할 수 있으므로 대부분의 브라우저 (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

61
"프롬프트"기능을 커스텀 모달로 변경하는 것은 사소한 일입니다. 트릭의 핵심은 편집 가능한 컨텐츠 필드를 사용하고 텍스트를 미리 선택하는 것입니다. 행동 자체. A ++
Jon z

110
여전히 자바 스크립트를 사용하여 클립 보드에 복사하지 않음 ^ _ ^
RozzA

23
텍스트는 2000 자 이상 인 경우는 절약 할 수 있지만, 작은 텍스트 샘플을 위해 잘 작동합니다
RasTheDestroyer

445
질문에 대답하지 않는 동안 457 개의 공감대를 얻는 것이 이상합니다 : Javascript로 클립 보드 복사하십시오 !
stevenvh

298

다음 접근 방식은 Chrome, Firefox, Internet Explorer 및 Edge 및 최신 버전의 Safari에서 작동합니다 (2016 년 10 월에 릴리스 된 버전 10에서 복사 지원이 추가됨).

  • 텍스트 영역을 만들고 그 내용을 클립 보드에 복사 할 텍스트로 설정하십시오.
  • 텍스트 영역을 DOM에 추가하십시오.
  • 텍스트 영역에서 텍스트를 선택하십시오.
  • document.execCommand ( "copy")를 호출하십시오.
  • 돔에서 텍스트 영역을 제거하십시오.

참고 : 텍스트 영역은 동일한 JavaScript 코드 호출 내에서 추가 및 제거되므로 텍스트 영역이 표시되지 않습니다.

직접 구현할 경우주의해야 할 사항 :

  • 보안상의 이유로, 이것은 클릭과 같은 이벤트 핸들러에서만 호출 할 수 있습니다 (창 열기와 마찬가지로).
  • Internet Explorer는 클립 보드를 처음 업데이트 할 때 권한 대화 상자를 표시합니다.
  • 텍스트 영역에 초점이 맞춰지면 Internet Explorer 및 Edge가 스크롤됩니다.
  • 경우에 따라 execCommand ()가 발생할 수 있습니다.
  • 텍스트 영역을 사용하지 않으면 줄 바꿈 및 탭이 삼킬 수 있습니다. (대부분의 기사는 div를 사용하는 것이 좋습니다)
  • 텍스트 영역은 Internet Explorer 대화 상자가 표시되는 동안 표시되며 숨기거나 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에 대한 오늘의 새로운 지원으로 클립 보드에 복사하는 것이 이제 자바 스크립트에서 가능하며 이는 어색한 'window.prompt ( "클립 보드에 복사 : Ctrl + C, Enter", 텍스트)'해결 방법 대신 허용되는 답변이어야합니다. window.clipboardData는 IE9에서 지원되므로 브라우저 지원 목록에 IE9를 추가해야하며 IE8 및 이전 버전이라고 생각하지만 확인해야합니다.
user627283

네. IE 8/9는 괜찮을 것입니다. 우리의 응용 프로그램은 그들을 지원하지 않습니다. 그래서 나는 테스트하지 않았습니다. IE는 1 월에 지원을 중단하므로 너무 소란스럽지 않습니다. 바라건대 Safari 지원이 곧 제공 될 것입니다. 나는 그들의 레이더에 있다고 확신합니다.
Greg Lowe

4
@SantiagoCorredoira : 2016 년에는 이것이 정답입니다. BGT (큰 녹색 눈금)를 다시 할당 해보십시오.
Lawrence Dol

3
내가 테스트하고 초점은 HTML 문서에없는 경우에도 파이어 폭스 (54), 크롬 (60) 및 에지 브라우저에 대해 완벽하게 작동 @Noitidart, 당신은 발생하는 오류는 버전 FF (55)에 고유은 아마
Tosin 존

2
@Noitidart 여전히 개발 도구에 중점을 두어도 완벽하게 작동합니다. 그건 그렇고, 일반적인 웹 응용 프로그램 사용자가 개발자 도구에 일을 할 것입니다 무엇
Tosin 존

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않으며 텍스트가 한 줄로 병합됩니다.

의견에서 @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하고 줄 바꿈을 추가하십시오
nikksan

1
Win10x64의 Microsoft Edge 42.17134.1.0에서 작동하지 않음
Honsa Stunna

3
답변을 복사했습니다. 그것은 크롬에서 작동하며 그것이 필요한 전부입니다.
user875234

Firefox v68.0.2 (64 비트)에서 작동하는 가장 간단한 솔루션입니다.
Arya

88

정말 간단한 솔루션을 원하고 (통합하는데 5 분도 걸리지 않음) 즉시 사용 가능한 것처럼 보이면 Clippy 는 좀 더 복잡한 솔루션을 대신 할 수있는 훌륭한 대안입니다.

GitHub의 공동 설립자에 의해 작성되었습니다. 아래의 플래시 임베드 코드 예 :

<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, "자바 스크립트"란 어떤 사람들은 "브라우저 클라이언트에서"를 의미하므로 JS 만 필요할 수도 있지만,이 답변을받을 가능성이있는 많은 사람들이 실제로 JS 또는 다른 지원을 찾고 있습니다. 클라이언트 기술. 플래시는 모든 플랫폼에 적용되는 것은 아니지만 클립 보드 지원과 같은 세련된 기능을 위해 팝업 대화 상자 (확실히 수행되는)를 통해 UX를 향상시키는 경우 추가 할 가치가 있습니다.
Dave Dopson

13
이제 Flash에 의존한다는 것은 웹 개발을하는 거의 모든 사람이 받아 들일 수없는 사이트 방문자의 비율에서 작동하지 않는 것을 의미합니다.
jinglesthula

86

웹 페이지에서 클립 보드를 읽고 수정하면 보안 및 개인 정보 보호 문제가 발생합니다. 그러나 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)않도록, 누군가 다른 구현을! Document.all은 이것과 전혀 관련이 없습니다.
m93a

1
남자, 이것은 간단하고 깨끗한 코드에 대해 좋아하는 것입니다. 소규모 유지 보수로 거의 영원히 작동합니다. 이것은 나를 위해 그것을했다, 그것은 아름답게 작동합니다.
사무엘 람잔

1
최신 크롬, 파이어 폭스 또는 MS Edge에서는 작동하지 않습니다. (
Jonathan Marzullo

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는 사용자에게 웹 응용 프로그램 클립 보드 권한을 부여하라는 메시지를 표시합니다.

Chrome에서 클립 보드 권한 을 제공하는 Chrome 확장 프로그램을 만들 수 있습니다 (이것이 Lucidchart에서 수행하는 작업입니다). 그런 다음 확장 기능이 설치된 사용자의 경우 시스템 이벤트를 직접 시작하면됩니다.

document.execCommand('copy');

Firefox에는 사용자가 특정 사이트에 클립 보드에 액세스 할 수있는 권한을 부여 할 수있는 몇 가지 옵션 이 있지만 개인적으로는 시도하지 않았습니다.


2
블로그 게시물에 언급되지 않았지만 (곧 업데이트 할 예정입니다) execCommand를 사용하여 잘라 내기 및 복사를 트리거하는 기능입니다. 이것은 IE10 +, Chrome 43+ 및 Opera29 +에서 지원됩니다. 여기에서 읽어보십시오. updates.html5rocks.com/2015/04/cut-and-copy-commands
Richard Shurtz

이것의 문제점은 다른 일반 복사 이벤트를 가로 챌 수 있다는 것입니다.
Brock Adams

NB! 이 브라우저 스니핑은 BAD입니다. 스니핑 기능을 수행하십시오. IE를 업데이트하기가 어렵습니다.
odinho-Velmont

51

clipboard.js 는 텍스트 나 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
플래시와 크로스 브라우저? iOS 및 Android 4.4에서 작동하지 않음
랩터

1
업데이트 된 답변을 참조하십시오. 이를 통해 플래시 사용자의 단계가 줄어들고 다른 모든 사용자에게는 대체가 가능합니다.
Justin

8
그것은 십억 줄의 코드를 가지고 있습니다. 절대적으로 조롱입니다. 그런 괴물을 프로젝트에 포함시키는 것보다 전혀하지 않는 것이 좋습니다
vsync

2
74K 버전 의 벨과 휘파람이 모두없는 20K 의 간단한 버전 gist.github.com/JamesMGreene/8698897 이 있습니다. 둘 다 크지 않습니다. 내 생각에 대부분의 사용자는 다운로드되는 74k 또는 20k 파일에 걸리는 여분의 밀리 초가 괜찮으므로 복사 / 붙여 넣기는 두 번이 아닌 한 번의 클릭으로 이루어집니다.
Justin

@ Justin 예제를 복사하여 붙여 넣더라도 로컬에서 작동하게 할 수는 없습니다 (예 : src스크립트 태그 의 값과 같은 최소 변경 ). 나는 그들의 문서가 예쁘지 만 비효율적이라고 생각합니다.
Gui Imamura

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에 연결 한
조 워너을

2
Safari (버전 11.1.2)에서는 작동하지 않습니다.
arjun27

1
@ arjun27 언젠가 애플이 따라 올 수 있기를 바랍니다. 이 caniuse.com/#feat=clipboard 는 부분적으로 지원되는 위에서 언급 한 버전을 보여줍니다.
KhoPhi

2
내가 READTEXT 두 기능지고있어, 거부 상태로 약속을 WRITETEXT
라민

3
제공된 링크에 따르면 "navigator.clipboard는 HTTPS를 통해 제공되는 페이지에서만 지원됩니다"
TimH-Codidact

26

내가 작업 한 프로젝트 중 하나에서 Zero Clipboard 라이브러리 를 사용하는 jQuery 클립 보드 클립 보드 플러그인 .

jQuery 사용자가 많으면 기본 Zero Clipboard 플러그인보다 사용하기가 더 쉽습니다.


6
92kb는 그다지 크지 않습니다. 빠르게 작동 text()하며 원하는 innerHTML()경우 대신 사용할 수 있습니다 .
RozzA

17
@John : innerHTML오랫동안 크로스 브라우저가 지원되었습니다. Microsoft가 원래 아이디어를 내놓았 기 때문에 신뢰할 수 없거나 독점적이지는 않습니다. 또한 모든 주요 브라우저 공급 업체가 이미 지원을 추가 한 후 공식 사양에 마침내 추가되었습니다 ... sigh .
James M. Greene

19
@John

4
innerHTML은 대부분의 경우 대안보다 낫습니다. 당신의 높은 말을 내려요! 더 빠르고 효율적이며 페이지를 다시 렌더링 할 필요가 없습니다.
궤도 Eden

4
@RozzA 92KB는 정말 큽니다. LTE가 성숙 할 때까지 GPRSWW 모바일 데이터 표준 이며 시작점1 KB/s 입니다. 직접 수학하세요.
Tino

23

Chrome 42 이상과 Firefox 41 이상은 이제 document.execCommand ( 'copy') 명령을 지원합니다 . 그래서 Tim Down의 이전 답변Google 개발자의 답변을 조합하여 브라우저 간 클립 보드로 복사 기능을위한 몇 가지 기능을 만들었습니다 .

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>


요약 해 주셔서 감사합니다! 코드에 약간의 실수가 있습니다. "range"변수를 두 번 정의했습니다 (var range = document.createRange ()).
Christian Engel

1
당신은 올바른 @ChristianEngel입니다. 두 번째 것을 제거했습니다. 나는 그것이 어떻게 들어 왔는지 모른다.
Jeff Baker

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

1
크롬. 탭은 하나의 공간으로 변환됩니다
Bikram

22

다음 해결책을 찾았습니다.

키 다운 핸들러에서 "pre"태그를 작성합니다. 이 태그에 복사 할 내용을 설정 한 다음이 태그를 선택하고 핸들러에서 true를 반환합니다. 크롬의 표준 핸들러를 호출하고 선택한 텍스트를 복사합니다.

그리고 필요한 경우 이전 선택을 복원하기위한 기능의 시간 초과를 설정할 수 있습니다. 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;

붙여 넣을 때 텍스트 영역이 만들어지고 같은 방식으로 작동합니다.

PS는이 솔루션이 플래시없이 완벽한 크로스 브라우저 솔루션을 만드는 데 사용될 수 있습니다. FF와 Chrome에서 작동합니다.


2
누구든지 그것을 시도 했습니까? 다양한 브라우저에서 실제로 작동하는 경우를 대비하여 멋진 것처럼 들립니다!
Michael

1
jsfiddle.net/H2FHC 데모 : fiddle.jshell.net/H2FHC/show 이를 열고 Ctrl + V 또는 Ctrl + C를 누르십시오. FF 19.0에서는 완벽하게 포크합니다. Chrome 25.0.1364.97 m에서도. 오페라 12.14-OK. Windows 용 Safari 5.1.7-확인 IE-실패.
Enyby

IE의 경우 페이지 내부의 요소에 초점을 맞춰야합니다. IE 9/10에서 작동하는 fiddle.jshell.net/H2FHC/3/showfiddle.jshell.net/H2FHC/3를 참조하십시오 . document.createRange가 지원되지 않으므로 IE 6/7은 다른 방법으로 프로세스 작성 선택을 필요로합니다.
Enyby

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

나는 내가 생각하는 것을 가장 잘 정리했다.

  • 직접 스타일이 아닌 Internet Explorer에서 예외를 피하기 위해 cssText를 사용합니다.
  • 선택이있는 경우 선택을 복원합니다
  • 키보드가 휴대 기기에서 나타나지 않도록 읽기 전용으로 설정
  • 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 발표에서 관련 섹션 읽기 )

해결책은 복사 버튼 위의 플래시 객체 또는 복사를 시작하는 모든 요소를 ​​과도하게하는 것입니다. Zero Clipboard는 현재이 구현에서 가장 좋은 라이브러리입니다. 숙련 된 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- 색인 : -900; 너비 : 0px; 높이 : 0px; 국경 : 없음; } 그래서 완전히 숨겨 질 것입니다! 그러나 정말 고마워 친구!
Federico Navarrete 2016 년

#t {resize : none;}
SmartManoj

순서대로 설명하겠습니다.
Peter Mortensen 19 :

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>

참고 : Internet Explorer 9 및 이전 버전에서는 document.execCommand()방법이 지원되지 않습니다.

출처 : W3Schools- 클립 보드에 텍스트 복사


11

이미 많은 답변이 있지만 하나를 추가하고 싶습니다 (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"/>' )

변수 데이터에서 직접 복사하는 방법. 즉 : var str = "word"; ?

변수 메시지가 사용되지 않음
Voyager

사용하는 것이 더 '<텍스트 영역 클래스 = "textToCopyInput"/> </ 텍스트 영역>'경우에 textToCopy포함\n
보이저


8

Excel에서 사용자 정의 그리드 편집을 작성하고 Excel과 호환성을 유지하는 것과 동일한 문제가있었습니다. 여러 셀 선택, 복사 및 붙여 넣기를 지원해야했습니다.

솔루션 : 사용자가 복사 할 데이터를 삽입 할 텍스트 영역을 작성하고 (사용자가 셀을 선택할 때 나에게) 포커스를 설정하십시오 (예 : 사용자가 누를 때) Ctrl ) 전체 텍스트를 선택하십시오.

따라서 사용자가 Ctrl+ C를 누르면 복사 한 셀이 선택됩니다. 테스트 후 텍스트 영역의 크기를 1 픽셀로 조정하면 디스플레이에서 작동하는지 테스트하지 않았습니다. 모든 브라우저에서 잘 작동하며 사용자에게 투명합니다.

붙여 넣기-이와 같이 할 수 있습니다 (대상에 따라 다름)-텍스트 영역에 계속 집중하고 onpaste를 사용하여 붙여 넣기 이벤트를 잡으십시오 (프로젝트에서 셀의 텍스트 영역을 사용하여 편집).

예제 (상업 프로젝트)를 붙여 넣을 수는 없지만 아이디어는 얻습니다.


7

clipboard.js를 사용했습니다.

우리는 npm에 그것을 얻을 수 있습니다 :

npm install clipboard --save

또한 Bower 에서도

bower install clipboard --save

사용법 및 예제는 https://zenorocha.github.io/clipboard.js/에 있습니다.


동적 콘텐츠와 호환되지 않는 것이 두려웠지만 ;-) 2008 년 이전의 것보다 더 나은 솔루션이라고 생각합니다.
BENARD Patrick


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

5

내 잘못이야. 이것은 IE에서만 작동합니다.

텍스트를 복사하는 또 다른 방법은 다음과 같습니다.

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

9
현재 Chrome (V31) 또는 FireFox (v25)에서는 작동하지 않습니다. 오류는 window.clipboardData가 정의되지 않았다는 것입니다. 장점은 IE9에서 작동합니다. 따라서 좋은 브라우저에 신경 쓰지 않고 나쁜 브라우저를 사용하여 사이트를 잠그고 싶은 한, 이것이 당신이 할 수있는 방법입니다!
Anthony

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.