Правильно ли Safari обрабатывает событие вставки?
Я пытаюсь написать код для Safari для обработки события "вставить", но он, похоже, работает неправильно. Согласно ссылке WebKit DOM,oncut
, onpaste
и oncopy
все обрабатываются более или менее, как предлагает API буфера обмена W3C. Однако это работает не так, как я ожидал. Я вставляю данные изображения, но, насколько я могу судить, проблема, с которой я сталкиваюсь, относится к любому виду пасты. Это jsfiddle отлично работает в Chrome, но не в Safari 6.0.4 на OSX.
$(function () {
console.log("ready");
$("#pastearea").on("paste", function (e) {
e.preventDefault();
console.debug("testing paste in safari");
var blob = e.originalEvent.clipboardData.items[0].getAsFile();
console.debug(blob);
var reader = new FileReader();
reader.onload = readerLoaded;
reader.readAsDataURL(blob);
});
});
function readerLoaded(e) {
$("#dest").attr("src", e.target.result);
}
я попробовал снова, используя только простой JS. Еще нет радости:
<div id="pastearea" onpaste="plainjsOnPaste()" style="width: 100px; height: 100px; background-color: blue;"/>
function plainjsOnPaste(e) {
console.log("blahblahblah");
console.log(e);
}
если есть какая-то проблема с Safari, то, очевидно, я не должен ожидать, что jQuery будет работать. Насколько я могу судить, во второй попытке (простой) я делаю именно то, что предлагает ссылка WebKit, но она не работает вообще. Это какое-то известное ограничение Safari, или проблема между стулом и клавиатурой?
обновление: это похоже, что Safari не реализует рабочий проект W3C API буфера обмена. Я исследую обходные пути, но если кто-то знает, я бы хотел услышать это.
2 ответов
https://bugs.webkit.org/show_bug.cgi?id=75891
Если вы хотите получить данные вставки во что-то, что не является contentEditable, текстовый ввод или текстовую область, я не знаю никакого метода, чтобы сделать текущую версию Safari сделать это.
Update: попытка обойти в это JSFiddle, упрощенный только для того чтобы общаться с текстом, не работает в Safari 6.0.5. Он пытается обойти, где скрытое текстовое поле автоматически фокусируется при нажатии Cmd-V, только для того, чтобы включить вставку в Safari. Это предотвращает "вы не можете вставить звуковой сигнал", но событие вставки не отправляется, и ничего не вставляется в секретный вход.
$(function () {
$(window).bind('keydown', function (e) {
// Cmd-V
if (e.which == 86 && e.metaKey) {
if (e.target.nodeName.toUpperCase() !== "INPUT")
$('#secretinput').focus();
}
});
$(window).bind('beforepaste', function (e) {
return false;
});
$(window).bind('paste', function (e) {
var clipboardData = e.originalEvent.clipboardData;
console.log(clipboardData);
$('#textdest').html(clipboardData.getData('text/plain'));
});
});
не знаю, поможет ли это вам, но я использую вход вне экрана, чтобы заставить safari принять вставку на странице. Это помогло мне так вот оно:
Я делаю:
сценарий:
$(document).bind('paste', function(e) {
var data = e.originalEvent.clipboardData.getData('Text');
// here using data from clipboard
});
$(function(){
$('input.special').focus();
});
css:
input.special{
position:absolute;
top:-40px;
}
HTML-код:
<input type="text" class="special" style="position: absolute;top:-40px;">