본문 바로가기
개발(Development)/JS(자바스크립트)

[JS] 텍스트 복사(Copy) 완전 쉬운 방법: Clipboard API

by 카레유 2022. 6. 23.

기존에 텍스트 복사를 구현하려면

document.execCommand("copy") 을 이용했다.

 

아래 글 참고

[자바스크립트] 텍스트 클립보드 복사(copy)/붙여넣기 기능 구현 방법

 

그러나 execCommand 메서드는 Deprecated 되었으며,

대안으로 훨씬 쉽고 강력한 Clipboard API 가 나왔다.

 

 window.navigator.clipboard.writeText()  메서드를 사용하면,

아주 쉽게 텍스트를 클립보드에 복사해둘 수 있다.

 

너무나 쉽고 좋아서 정리해두지 않을 수 없다.


1. 텍스트 복사

navigator.clipboard.writeText("복사할 텍스트")  호출하면 끝!

- 비동기로 복사를 수행하고 Promise 를 반환하므로, 복사가 완료되었을 때 수행할 작업을 then의 콜백함수로 넘어주면 된다.

// writeText()의 인자로 넣은 텍스트가 복사된다.
window.navigator.clipboard.writeText("복사될 텍스트").then(() => {
  // 복사가 완료되면 이 부분이 호출된다.
  alert("복사 완료!");
});

- 이런 방식으로 URL 복사/공유 기능을 아주 쉽게 구현할 수 있을 것 같다.

 

2. HTML 엘리먼트의 내용 복사

- input이나 textarea 등의 내용을 value 속성으로 취득한 다음, writeText() 의 인자로 넣어 호출해주면 된다.

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>복사</title>
  </head>
  <body>
    <!-- textarea와 button 생성 -->
    <textarea id="myTextarea"></textarea>
    <button id="myButton">복사</button>
  </body>

  <script>
    // $textarea
    const myTextarea = document.getElementById("myTextarea");

    // button 클릭 이벤트
    document.getElementById("myButton").onclick = () => {
      // textarea의 내용을 복사한다.
      window.navigator.clipboard.writeText(myTextarea.value).then(() => {
        // 복사가 완료되면 호출된다.
        alert("복사완료");
      });
    };
  </script>
</html>

 

<실행 화면>

- 글을 입력하고 "복사" 버튼을 누르면, 입력한 내용이 복사된다.

 

복사

 

3. 일반 HTML 태그의 내용 복사

- div 등의 내용도 textContent 등으로 취득해서 복사하면 된다.

<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>복사</title>
  </head>
  <body>
    <!-- div와 button 생성 -->
    <div id="myDiv">div의 내용입니다.</div>
    <button id="myButton">복사</button>
  </body>

  <script>
    // div 취득
    const myDiv = document.getElementById("myDiv");

    // button 클릭 이벤트
    document.getElementById("myButton").onclick = () => {
      // div의 내용(textContent)을 복사한다.
      window.navigator.clipboard.writeText(myDiv.textContent).then(() => {
        // 복사가 완료되면 호출된다.
        alert("복사완료");
      });
    };
  </script>
</html>

 

실행화면은 생략.


단순히 텍스트 뿐만 아니라, img 등의 html 엘리먼트를 내용을 다룰 수 있는

read(), write() 등의 메서드도 제공된다고 한다.

 

자세한 내용은 레퍼런스를 참고하자.

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


※ 주의 사항

clipboard API 는 localhost나 https 환경에서만 동작한다.

 

MDN 상에서도 https 에서만 가능한 기능이라고 명시되어 있다.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

 

만약 서버에 배포했는데, https가 아닌 http라면 아래와 같은 에러코드를 만나게 된다.

Uncaught TypeError: Cannot read properties of undefined (reading 'writeText')

 

정석적인 해결 방법은 https로 서비스하는 것 이지만,

여의치 않다면, execCommand('copy')를 사용할 수 밖에 없지 않나 싶다.

 

execCommand가 deprecated되어 권장하긴 어렵지만, 아래와 같은 코드로 기능 구현 자체는 가능할 것이다.

// 텍스트 복사 기능 구현
function copyText() {
    // clipboard API 사용
    if (navigator.clipboard !== undefined) {
      navigator.clipboard
        .writeText(`복사할 텍스트`)
        .then(() => {
          alert('텍스트가 복사되었습니다.');
        });
    } else {
      // execCommand 사용
      const textArea = document.createElement('textarea');
      textArea.value = `복사할 텍스트`;
      document.body.appendChild(textArea);
      textArea.select();
      textArea.setSelectionRange(0, 99999);
      try {
        document.execCommand('copy');
      } catch (err) {
        console.error('복사 실패', err);
      }
      textArea.setSelectionRange(0, 0);
      document.body.removeChild(textArea);
      alert('텍스트가 복사되었습니다.');
    }
  };

 

execCommand에 대한 더 자세한 내용은 아래 글을 참고.

[자바스크립트] 텍스트 클립보드 복사(copy)/붙여넣기 기능 구현 방법

 

 

 

댓글