2013-06-05 11 views
8

Próbuję napisać kod dla Safari do obsługi zdarzenia wklejania, ale wydaje się, że nie działa poprawnie. Zgodnie z odniesieniem do WebKit DOM, oncut, onpaste i oncopy są obsługiwane bardziej lub mniej, tak jak sugeruje API Clipboard W3C. Jednak nie działa tak, jak się spodziewam. Wklejam dane obrazu, ale o ile mi wiadomo, problem, który mam, dotyczy każdego rodzaju wklejenia. Ten jsfiddle działa dobrze w Chrome, ale nie w Safari 6.0.4 na OS X.Czy Safari obsługuje poprawnie wklejanie zdarzenia?

$(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); 
} 

Próbowałem ponownie, używając tylko plain JS. Nadal nie ma radości:

<div id="pastearea" onpaste="plainjsOnPaste()" style="width: 100px; height: 100px; background-color: blue;"/> 

function plainjsOnPaste(e) { 
    console.log("blahblahblah"); 
    console.log(e); 
} 

Jeśli jest jakiś problem z Safari, to oczywiście nie powinienem oczekiwać, że jQuery zadziała. O ile mogę powiedzieć, w drugiej próbie (zwykły) robię dokładnie to, co sugeruje WebKit, ale powinienem to zrobić, ale w ogóle nie działa. Czy jest to znane ograniczenie Safari, czy też problem między krzesłem a klawiaturą?

Aktualizacja: wygląda na to, że Safari nie implementuje roboczą wersję roboczą interfejsu API Schowka w W3C. Badam obejścia, ale jeśli ktokolwiek je zna, to chciałbym to usłyszeć.

+1

Wydaje Safari potrzebuje jakiegoś obszaru wprowadzania, w którym można wykonać wklejanie, użycie 'contentEditable = true' uruchomi zdarzenie w Safari http://jsfiddle.net/RrP8X/ – Duopixel

+0

@Duopixel dlaczego komentarz, a nie odpowiedź? To jest całkowicie poprawna odpowiedź (nawet lepiej, jeśli możesz podać źródło do tego ...). –

+0

Byłoby również wskazane, aby zrobić to bez ustawiania contentEditable - ma to pewne niepożądane efekty uboczne, takie jak wyświetlanie kursora textarea na fokusie. –

Odpowiedz

8

Myślę, że odpowiedź, jakkolwiek niesatysfakcjonująca, brzmi "nie". Zobacz ten WebKit błąd:

https://bugs.webkit.org/show_bug.cgi?id=75891

Jeśli twoim zamiarem jest, aby odbierać dane wkleić do czegoś, co nie jest contentEditable, wejście tekst lub pole tekstowe, ja nie znam żadnego sposobu, aby aktualną wersję Safari to robi.

Aktualizacja: próba obejścia w trybie this JSFiddle, uproszczona do obsługi wyłącznie tekstu, nie działa w przeglądarce Safari 6.0.5. Próba obejścia, w którym ukryte pole tekstowe jest automatycznie skupiane po naciśnięciu klawisza Cmd-V, aby umożliwić wklejanie w przeglądarce Safari. Zapobiega "nie można wkleić sygnału dźwiękowego", ale nie jest wysyłane żadne zdarzenie wklejenia i nic nie jest wklejane do tajnego wejścia.

+0

@Juhana whoops wygląda na to, że skopiowałeś jakiś kod do tej odpowiedzi, którą celowo pominąłem. Możesz napisać nową odpowiedź, jeśli chcesz odpowiedzieć na to w inny sposób niż ja. Dzięki! :) –

0

Nie wiem, czy to ci pomaga, ale używam danych z ekranu, aby zmusić Safari do zaakceptowania wklejania na stronie. To pomogło mi więc o to idzie:

robię:

scenariusz:

$(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;">