브라우저와 클립보드
특정 버튼이나 텍스트를 클릭 시, 관련 텍스트를 clipboard에 복사해주는 기능을 제공하는 사이트들이 있다.
본인도 첫 회사에 입사 한지 얼마 안된 시점에서 뿜뿜(기능의 이름)이라는 비슷한 기능 구현을 요청 받았었는데
- 특정 버튼 클릭
- 수익률 관련 모달 팝업
- 팝업에 복사 버튼 클릭시 이미지를 클립보드에 복사
이런 동작을 요구 했었다.
관련해서 전반적인 내용을 학습해보자.
클립보드란?
일반적으로 클립보드는 OS에서 제공하는 일시적으로 텍스트, 파일, 이미지 등 다양한 종류의 데이터를 저장하는 메모리 영역으로 잘라내기, 복사, 붙여넣기 작업을 수행할 때 사용된다.
클립보드에 데이터를 넣는 방법
잘라내기(cut) 또는 복사하기(copy) 작업을 수행하면, 선택한 데이터가 클립보드에 저장된다.
- copy: 선택한 데이터를 메모리에 복사
- cut: 선택한 데이터를 메모리에 복사 후, 원본 삭제
클립보드는 운영 체제의 메모리 관리 기능( 가상 메모리)을 활용하여 데이터를 저장하므로, RAM보다 큰 용량의 데이터도 처리할 수 있다.
browser 환경에서는?
브라우저는 사용자가 실행하는 응용프로그램이고, 우리가 작성한 자바스크립트는 브라우저 위에서 동작한다.
그러므로 브라우저에서 사용자의 컴퓨터 클립보드에 데이터를 저장하는 기능이 없다면, 저장할 수 없다.
가능하다면 이는 해킹의 영역이다.
그래서 관련된 기능을 web api로 제공하는데...
document.execCommand
첫번째는 Deprecated
된 document.execCommand api다.
아래의 clipboard api
가 나오기 전까지는 클립보드에 데이터를 저장할 수 있는 유일한 방법이었고, 현재도 많이 사용되는 방법이다.
아직도 많이 사용되는 clipboard.js도 내부적으로 execCommand api
을 사용한다.
해당 api를 사용하는 방식을 보자.
- 카피를 원하는 txt를 보이지 않는 input, textarea tag를 생성 후, value에 넣어준다.
- 위에서 생성 된 태그에 select method를 실행한다(텍스트 선택).
document.execCommand("copy")
을 실행한다.- 생성 된 태그를 삭제한다.
const tag = document.querySelector("h1");
if (tag) {
tag.onclick = () => {
const tmp = document.createElement("textarea");
tmp.value = tag.textContent;
document.body.appendChild(tmp);
tmp.select();
document.execCommand("copy");
document.body.removeChild(tmp);
};
}
위 코드를 아무 페이지나 들어가서 tag 잡을 수 있게 처리 후, console에서 실행하면 해당 태그 클릭시 텍스트가 복사 될 것이다.
참고로 웹 페이지에서 js로 document.execCommand("copy")
를 실행하려면 사용자의 액션이 동반되어야 execCommand api
가 동작한다.
애초에 사용자에게 권한을 허용받지 않고 클립보드에 데이터를 저장할 수 있는게 문제가 될 수 있는데,
액션조차 없이 js로 저장할 수 있다는 건, 보안상 문제 가능성이 있기 때문에 최소한의 제약을 설정한 것으로 보인다.