2014-11-29 2 views
1

операция копирования может быть обработана с помощью пасты события:Как я должен, согласно W3C, поместить холст в буфер обмена?

div.addEventListener("copy", function() { ... }); 

event является отменяемым и наряду с другой информацией событий обеспечивает DataTransfer объекта:

var items = event.clipboardData; 

Этот объект имеет метод .setData, который должен позволить вам добавлять данные в буфер обмена. К несчастью, я не могу понять, как это работает. Documentation is broken (если вы нажмете на setData, он перейдет на неправильную страницу).

Я пытался что-то вроде этого:

function copy(event) { 
    var items = (event.clipboardData || event.originalEvent.clipboardData); 
    items.setData("image/png", _this.editor.selection.getSelectedImage()); 

    event.preventDefault(); 
    event.cancelBubble = true; 
    return false; 
    } 

Но согласно MDN, второй параметр должен быть строкой тоже.

Как я могу поместить данные в буфер обмена в соответствии со спецификацией (никаких функций, специфичных для браузера)?

ответ

2

Я являюсь редактором спецификации API буфера обмена.

Во-первых, извините за нарушение связи. Это на самом деле работает в официальном TR:

http://www.w3.org/TR/clipboard-apis/

Но не в проекте редактора, за несколько запутанных причины процесса («официальная» HTML5 спецификация упала набивать буфер обмена API спецификация зависит от, жесткого кодирования ссылка на конкретный исторический снимок официальной спецификации HTML5 кажется плохой идеей - поэтому мне нужно решить, нужно ли просто ссылаться на спецификацию WHATWG или ждать, пока не возникнет гипотетическая ситуация с HTML6-приложением-DnD-back-in.

Теперь, исправление этой ссылки на самом деле не решит вашу проблему - потому что даже в supposedly bleeding-edge WHATWG spec setData() указан как взятие строки. Веб-технология - это незавершенная работа, и вы столкнулись с прецедентом, который API (old) setData() не учитывал. Эта часть API датируется исходной реализацией Microsoft. Чтобы быть справедливым, JavaScript сам по себе не имел удобных способов работать с двоичными данными тогда.

Что вы, вероятно, захотите использовать, является передачей clipboardData.items.add() APIa File object с соответствующими данными и типом. Обратите внимание, что это пока еще не реализовано, например, AFAIK не поддерживается в любой текущей версии Firefox. Вы можете обнаружить отсутствие clipboardData.items и .items.add() и, например, указать пользователям щелкнуть правой кнопкой мыши изображение и выбрать «копировать в буфер обмена» вручную.

Смежные вопросы