Правильно ли 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;">