아래와 같이, 복사하기 버튼을 눌렀을 때 클립보드에 텍스트를 복사하려면 어떻게 해야할까?
Document.execCommand()를 사용하거나 Clipboard API를 활용하는 방법도 있다.
Document.exeCommand()
아래는 exeCommand()에 대한 MDN의 설명이다.
When an HTML document has been switched to designMode, its document object exposes an execCommand method to run commands that manipulate the current editable region, such as form inputs or contentEditable elements.
즉, HTML document가 디자인 모드로 바뀌면서 exeCommand를 사용하면, form의 input과 같이 편집이 가능한 element를 조작할 수 있다는 것이다. 그래서 element의 내용을 클립보드로 복사할 수 있게 되었다고 이해하면 좋을 것 같다.
따라서, 어떤 element의 innertext를 복사하고자 한다면, 그 element가 editable한 input이나 textarea여야 한다.
만약, 해당 element가 input이나 textarea가 아니라면, 아래의 코드처럼 textarea를 만들었다가 지우는 방식을 사용하면 된다.
const pinyin = pinyinRef.current.innerText;
const textField = document.createElement('textarea');
textField.innerText = pinyin;
document.body.appendChild(textField);
textField.select();
document.execCommand('copy');
textField.remove();
pinyinRef가 내가 복사하려고 하는 text를 가지고 있는 element를 참조하는 ref 객체이다.
그래서 그 pinyinRef.current의 innerText(복사하고자하는 텍스트)를 가져와서 textField라는 임시 textarea의 innerText로 넣어준다.
document에 임시 textarea를 붙여주고, 그 textarea를 select하여 복사하고자 하는 텍스트를 선택하고,
document.execCommand('copy')를 사용하여 해당 텍스트를 클립보드에 복사한다.
그리고 다시, 임시 textarea를 지워주면 된다.
하지만, Document.execCommand()는 MDN 문서에서 알 수 있듯 더 이상 추천하지 않는 방식이다.
대신, clipboardAPI를 사용한다.
Clipboard API
Clipboard API는 Promise 기반으로 클립 보드 내용을 비동기적으로 접근할 수 있는 API이다.
아주 아주 간단하다.
const pinyin = pinyinRef.current.innerText;
navigator.clipboard.writeText(pinyin);
navigator.clipboard.writeText 만을 사용해서 가능하다. 즉, 붙여넣고자 하는 text를 인자로 넣어주면 된다.
'Front-end > React' 카테고리의 다른 글
next에 antd 적용 안 될 때 (0) | 2021.04.10 |
---|---|
Redux가 필요한 이유와 기본 개념 (0) | 2020.11.14 |
React: props와 state (0) | 2020.10.25 |