Как работает функция вставки изображения из буфера обмена в Gmail и Google Chrome 12+?

Я заметил сообщение в блоге от Google это упоминает возможность вставлять изображения непосредственно из буфера обмена в сообщение Gmail, если вы используете последнюю версию Chrome. Я попробовал это с моей версией Chrome (12.0.742.91 beta-m), и он отлично работает с помощью клавиш управления или контекстного меню.

из этого поведения мне нужно предположить, что последняя версия webkit, используемая в Chrome, может иметь дело с изображениями в событии вставки Javascript, но я был не удалось найти никаких ссылок на такое улучшение. Я верю ZeroClipboard привязывается к событиям нажатия клавиш, чтобы вызвать его функциональность flash, и как таковая не будет работать через контекстное меню (кроме того, ZeroClipboard является кросс-браузером, и сообщение говорит, что это работает только с Chrome).

Итак, как это работает и где было сделано улучшение для Webkit (или Chrome), которое позволяет функциональность?

6 ответов


Я провел некоторое время, экспериментируя с этим. Кажется, он вроде как следует за новым спецификация API буфера обмена. Вы можете определить обработчик событий "вставить" и посмотреть на событие.clipboardData.элементы и вызов getAsFile () на них, чтобы получить Blob. После того, как у вас есть Blob, вы можете использовать FileReader на нем, чтобы увидеть, что в нем. Вот как вы можете получить url-адрес данных для материала, который вы только что вставили в Chrome:

// 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, или вы можете поместить его в XHR, используя виде FormData.


ответ Ника, похоже, нуждается в небольших изменениях, чтобы все еще работать:)

// 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/

таким образом, изменения в Nicks ответ были:

var items = event.clipboardData.items;

до

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

также мне пришлось взять второй элемент из вставленных предметов (первый, кажется, текст/HTML, если вы копируете картинку с другой веб-страницы в буфер). Поэтому я изменил

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

к циклу находя элемент, содержащий изображение (см. выше)

Я не знал, как ответить непосредственно на ответ Ника, надеюсь, здесь все в порядке:$:)


вот плавный плагин jQuery, завершающий всю сделку (в основном те же принципы, что и Ник): http://strd6.com/2011/09/html5-javascript-pasting-image-data-in-chrome/

У него есть живая демонстрация, аннотированный исходный код и все такое.


веб-браузеры продолжают идти вперед. Я недавно нашел это:

фрагмент кода-доступ к изображениям буфера обмена с помощью Javascript

и так:

пустырь пасты (или, почему событие onPaste является беспорядком)

первая ссылка описывает способ получения изображений буфера обмена с помощью JavaScript только в Firefox и Chrome. Вторая ссылка содержит постскриптум, в котором упоминается тот же метод, который был адаптирован к IE (неизвестно версия.)


насколько я знаю -

с функциями HTML 5 (Api файлов и связанных с ними) - доступ к данным изображения буфера обмена теперь возможен с помощью простого javascript.

Это, однако, не работает на IE (что-нибудь меньше IE 10). Не знаю много о поддержке IE10 также.

для IE optiens, которые я считаю, являются "резервными" вариантами либо с помощью api Air Adobe или использование подписанного апплета


Вау, это круто. Я еще не нырнул в источник gmail, чтобы понять это (я сделал с функциональностью перетаскивания), но я предполагаю, что это расширение API перетаскивания, которое chrome уже расширил. Есть приличная запись о том, как работает функция перетаскивания на рабочий стол:http://www.thecssninja.com/javascript/gmail-dragout это может по крайней мере указать вам в правильном направлении.