클립 보드 기능의 붙여 넣기 이미지는 Gmail 및 Google Chrome 12 이상에서 어떻게 작동합니까?


148

최신 버전의 Chrome을 사용하는 경우 클립 보드에서 직접 Gmail 메시지에 이미지를 붙여 넣을 수있는 기능이 언급 된 Google블로그 게시물을 발견했습니다 . 내 Chrome 버전 (12.0.742.91 베타 -m) 으로이 작업을 시도했으며 컨트롤 키 또는 상황에 맞는 메뉴를 사용하여 훌륭하게 작동합니다.

이 동작에서 Chrome에 사용 된 최신 버전의 웹킷이 Javascript 붙여 넣기 이벤트에서 이미지를 처리 ​​할 수 ​​있다고 가정하지만 그러한 개선에 대한 참조를 찾을 수 없습니다. 내가 믿는 ZeroClipboard의 키 누르기 이벤트에 바인딩이 플래시 기능을 트리거와 같은 할 것 컨텍스트 메뉴를 통해하지 작업 (또한, ZeroClipboard는 크로스 브라우저이고 게시물이 크롬에서만 작동 말한다).

그렇다면 어떻게 작동하고 기능을 가능하게하는 웹킷 (또는 Chrome)이 개선 되었습니까?


3
Firefox에서도 무작위로 작동하는 것 같습니다. 이것이 Firefox에서 지원되어야하는지 아는 사람이 있습니까?
Sébastien

답변:


231

나는 이것을 실험하면서 시간을 보냈다. 새로운 Clipboard API 사양 을 따르는 것 같습니다 . "붙여 넣기"이벤트 핸들러를 정의하고 event.clipboardData.items를보고 getAsFile ()을 호출하여 Blob을 얻을 수 있습니다. Blob이 있으면 FileReader 를 사용 하여 내용을 볼 수 있습니다 . 다음은 방금 Chrome에 붙여 넣은 내용에 대한 데이터 URL을 얻는 방법입니다.

// window.addEventListener('paste', ... or
document.onpaste = function(event){
  var items = (event.clipboardData || event.originalEvent.clipboardData).items;
  console.log(JSON.stringify(items)); // will give you the mime types
  for (index in items) {
    var item = items[index];
    if (item.kind === 'file') {
      var blob = item.getAsFile();
      var reader = new FileReader();
      reader.onload = function(event){
        console.log(event.target.result)}; // data url!
      reader.readAsDataURL(blob);
    }
  }
}

데이터 URL이 있으면 페이지에 이미지를 표시 할 수 있습니다. 대신 업로드하려면 readAsBinaryString을 사용하거나 FormData를 사용하여 XHR에 넣을 수 있습니다.


6
여기 빨대를 쥐고 ​​있지만 Safari 5.1에서 event.clipboardData.items가 '정의되지 않은'것 같은 아이디어가 있습니까? 또는 Safari에서 파일 / 블로 브의 클립 보드 내용을 얻는 방법? Chrome에서 잘 작동합니다. 당신은 웹킷이 웹킷이라고 생각할 것이다 :(
Gavin Gilmour

7
@SenicaGonzalez는 데이터가 이벤트 기간 동안 만 존재하기 때문입니다. 이벤트가 끝나면 이벤트가 사라 지므로 인스펙터에서 객체를 뒤집으려고하면 아무것도 보이지 않습니다.
Nick Retallack

3
나는 이것을 Firefox에서 실행하고 var blob = items [0] .getAsFile () throw TypeError : items is undefined
chinna_82

2
해당 이미지 데이터로 XMLHttpRequest를 제출하는 방법을 예제로 작성 하시겠습니까? 정말 좋을 것입니다 : D
poitroae

1
다음은 XMLHttpRequest를 사용하여 제출 한 후 블로그에 구현 한 후 블로그에 작성하는 방법입니다. blog.securevideo.com/2013/11/27/…
JT Taylor

56

Nick의 대답은 여전히 ​​작동하기 위해 약간의 변경이 필요한 것 같습니다. :)

// window.addEventListener('paste', ... or
document.onpaste = function (event) {
  // use event.originalEvent.clipboard for newer chrome versions
  var items = (event.clipboardData  || event.originalEvent.clipboardData).items;
  console.log(JSON.stringify(items)); // will give you the mime types
  // find pasted image among pasted items
  var blob = null;
  for (var i = 0; i < items.length; i++) {
    if (items[i].type.indexOf("image") === 0) {
      blob = items[i].getAsFile();
    }
  }
  // load image if there is a pasted image
  if (blob !== null) {
    var reader = new FileReader();
    reader.onload = function(event) {
      console.log(event.target.result); // data url!
    };
    reader.readAsDataURL(blob);
  }
}

실행 코드 예 : http://jsfiddle.net/bt7BU/225/

따라서 닉 답변의 변경 사항은 다음과 같습니다.

var items = event.clipboardData.items;

var items = (event.clipboardData  || event.originalEvent.clipboardData).items;

또한 붙여 넣은 항목에서 두 번째 요소를 가져와야했습니다 (다른 웹 페이지에서 버퍼로 이미지를 복사하는 경우 첫 번째 요소는 text / html 인 것 같습니다). 그래서 나는 바꿨다

  var blob = items[0].getAsFile();

이미지가 포함 된 항목을 찾는 루프로 (위 참조)

나는 Nick의 대답에 직접 대답하는 방법을 몰랐다.


1
이미지 데이터를 XMLHttpRequest로 어떻게 제출해야합니까?
poitroae

이 글을 읽고 다른 사람에게,이 질문에 대한 대답은 지금이 포함될 수있다 : stackoverflow.com/questions/18055422/... :
robintibor

4
이해가 안 돼요 브라우저에 파일을 붙여 넣으면 clipboardData.itemsGoogle 크롬에서 항상 비어 있습니다 (Firefox 작동). 크롬은 이제 IE와 거의 같은 최적화가 필요합니다.
Tomáš Zato-복원 모니카

1
작은 편집 : if (blob! = null) {(또는 초기화에서 blob = null로 설정)
Pancakeo

1
event.clipboardData.items최신 Chrome에서 나를 위해 잘 작동했지만 언제 event.originalEvent...유용한 지 확실하지 않습니까?
Ruben Martinez Jr.


5

웹 브라우저는 계속 전진하고 있습니다. 나는 최근에 이것을 발견했다 :

코드 스 니펫 — Javascript를 사용하여 클립 보드 이미지에 액세스

이:

Paste Wasteland (또는 onPaste 이벤트가 엉망인 이유)

첫 번째 링크는 Firefox 및 Chrome에서만 JavaScript를 사용하여 클립 보드 이미지를 얻는 방법을 설명합니다. 두 번째 링크에는 동일한 기술이 IE (알 수없는 버전)에 적용되었음을 언급하는 포스트 스크립트가 포함되어 있습니다.


Firefox는 심지어 편집 | 나를 위해 메뉴 항목을 붙여 넣으면 Firefox에서 어떻게 작동하는지 볼 수 없습니다.
podperson

댓글 작성시 해당 링크 중 하나가 작동하지 않습니다.
Crazywako

2

내가 아는 한 -

HTML 5 기능 (File Api 및 관련)을 사용하면 일반 자바 스크립트로 클립 보드 이미지 데이터에 액세스 할 수 있습니다.

그러나 IE (IE 10 미만)에서는 작동하지 않습니다. IE10 지원에 대해서도 잘 모릅니다.

IE의 경우 '대체'옵션이라고 생각되는 옵티 펜은 Adobe의 AIR API를 사용하거나 서명 된 애플릿을 사용하고 있습니다.


1

와 멋지다. 나는 아직 그것을 알아 내기 위해 gmail 소스로 뛰어 들지 않았지만 (드래그 아웃 기능으로 했음) 크롬이 이미 확장 한 드래그 / 드롭 API의 확장이라고 생각합니다. 괜찮은 쓰기까지 드래그 - 투 - 데스크톱 기능의 작동 방법이있다 : http://www.thecssninja.com/javascript/gmail-dragout 이 올바른 방향으로 5 월 적어도 지점 당신은.


0

이것은 내 프로젝트에서 작동하는 angular2 typescript의 예제에서 가져온 것입니다. 그것이 누군가를 돕기를 바랍니다. 다른 경우에도 논리는 동일합니다.

https://gist.github.com/sandeepsuvit/a8ba77faebba260455985504be24aef7

실제 구현은 다음과 같습니다.

https://stackblitz.com/edit/angular-f7kcny?file=app/app.component.ts


1
어떤 과정을 따랐는지 설명해 주시겠습니까? https://stackblitz.com/edit/angular-f7kcny?file=app/app.component.ts크롬으로 링크 를 연 다음 웹 사이트에서 이미지를 마우스 오른쪽 버튼으로 클릭하십시오. 그런 다음 제공된 텍스트 상자에 붙여 넣습니다. 그런 식으로 작동해야합니다.
Sandeep K Nair

웹 이미지에서 복사했습니다. Windows 탐색기에서 이미지를 사용해 보았습니다. 왜 작동하지 않습니까? Windows 탐색기에서 복사 한 이미지를 처리하여 웹 페이지에 붙여 넣는 방법을 알고 있습니까?
Battle Hawk

아직이 옵션을 시도하지 않았습니다. 희망 대신 이러한 라이브러리에서 통찰력을 얻을 수 있습니다 https://github.com/layerssss/paste.js/, https://github.com/JoelBesada/pasteboard. 이 링크에는 시연 할 수있는 데모가 있습니다.
Sandeep K Nair

Windows 운영 체제 컴퓨터에 이미지를 붙여 넣을 때 event.clipboardData가 비어 있습니다.
Tunç Doğan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.