2013-03-06 22 views
16

Próbuję umożliwić użytkownikowi wkleić obraz do div. Problem polega na tym, że potrzebuję jej pracy w Firefoksie.Pobierz Wklejony obraz ze schowka Firefox

Z tego co przeczytałem, Firefox od wersji 13 (chyba) nie pozwala na dostęp JavaScript do schowka, a event.clipboard nie istnieje w nim. Wiem, że można to zrobić, ponieważ Gmail i Yahoo pozwalają na to nawet w Firefoksie.

Po prostu chcę, żeby działało w każdym razie posible, bądź z jQuery, JavaScript, HTML5, nie ma znaczenia tak długo, jak działa w najnowszym Firefoksie. (No Flash).

+0

możliwy duplikat [W jaki sposób obraz wklejony z funkcji schowka działa w Gmailu i Google Chrome 12+?] (Http://stackoverflow.com/questions/6333814/how-does-the-paste-image-from- clipboard-functional-work-in-gmail-and-google-c) – epascarello

+6

@epascarello To nie jest duplikat, ponieważ próbowałem go i nie działa w firefoxie, jak powiedziałem w poście event.clipboard nie istnieje w firefox, ale dzięki i tak – trebor

+2

stworzyłem prosty ujednolicony interfejs próbując to zrobić w różnych przeglądarkach, może powinieneś spróbować https://github.com/Puffant/paste.js –

Odpowiedz

14

Użyłem kodu z this question dla mojej implementacji wklejenia między przeglądarkami .. działa we wszystkich przeglądanych przeze mnie przeglądarkach (przewiń w dół dla rzeczywistego rozwiązania/kodu). Należy zauważyć, że event.clipboardData wygasa natychmiast po zakończeniu wykonywania instrukcji wklejania.

Sprawdziłem cztery razy, czy działa to w Firefoksie w wersji 19 (nie mam 13 dostępnych, ale brzmi to tak, jakby pytanie dotyczyło degradacji funkcji w nowszych wersjach).

Poniżej znajduje się odpowiedź, cytowany z Nico Burns:

Rozwiązanie

Przetestowane w IE6 +, FF 3.5, niedawne-owski wersje Opera, Chrome, Safari.

function handlepaste (elem, e) { 
 
    var savedcontent = elem.innerHTML; 
 
    if (e && e.clipboardData && e.clipboardData.getData) {// Webkit - get data from clipboard, put into editdiv, cleanup, then cancel event 
 
    if (/text\/html/.test(e.clipboardData.types)) { 
 
     elem.innerHTML = e.clipboardData.getData('text/html'); 
 
    } 
 
    else if (/text\/plain/.test(e.clipboardData.types)) { 
 
     elem.innerHTML = e.clipboardData.getData('text/plain'); 
 
    } 
 
    else { 
 
     elem.innerHTML = ""; 
 
    } 
 
    waitforpastedata(elem, savedcontent); 
 
    if (e.preventDefault) { 
 
     e.stopPropagation(); 
 
     e.preventDefault(); 
 
    } 
 
    return false; 
 
    } 
 
    else {// Everything else - empty editdiv and allow browser to paste content into it, then cleanup 
 
    elem.innerHTML = ""; 
 
    waitforpastedata(elem, savedcontent); 
 
    return true; 
 
    } 
 
} 
 

 
function waitforpastedata (elem, savedcontent) { 
 
    if (elem.childNodes && elem.childNodes.length > 0) { 
 
    processpaste(elem, savedcontent); 
 
    } 
 
    else { 
 
    that = { 
 
     e: elem, 
 
     s: savedcontent 
 
    } 
 
    that.callself = function() { 
 
     waitforpastedata(that.e, that.s) 
 
    } 
 
    setTimeout(that.callself,20); 
 
    } 
 
} 
 

 
function processpaste (elem, savedcontent) { 
 
    pasteddata = elem.innerHTML; 
 
    //^^Alternatively loop through dom (elem.childNodes or elem.getElementsByTagName) here 
 

 
    elem.innerHTML = savedcontent; 
 

 
    // Do whatever with gathered data; 
 
    alert(pasteddata); 
 
}
<div id='div' contenteditable='true' onpaste='handlepaste(this, event)'>Paste</div>

Objaśnienie

Zdarzenie onpaste posiada funkcję handlepaste przymocowany do niej i przekazywane dwa parametry: this (to jest odnosi się do elementu, że zdarzenie jest dołączony do) i event, który jest obiektem zdarzenia.


handlepaste funkcja:

Pierwszy wiersz po prostu zapisuje zawartość edycji div do zmiennej, więc może być przywrócony ponownie na końcu.

Parametr sprawdza, czy przeglądarka jest przeglądarką internetową (chrome lub safari), a jeśli tak, ustawia zawartość edytowalnego div dla wklejonych danych. Następnie anuluje wydarzenie, aby zapobiec dwukrotnemu wklejeniu pliku Webkit. Jest tak, ponieważ webkit jest niezręczny i nie wkleja niczego, jeśli po prostu wyczyścisz div.

Jeśli to nie jest przeglądarka internetowa, to po prostu usuwa edytowalny element div.

Następnie wywołuje waitforpastedata funkcja


waitforpastedata funkcja:

Jest to konieczne, ponieważ wklejone dane nie pojawiają się od razu, więc jeśli tylko nazywa processpaste razu to byłoby miło nie ma żadnych danych do przetworzenia.

To, co robi, to sprawdzenie, czy edytowalny element div ma jakąś zawartość, jeśli wywołuje wtedy processpaste, w przeciwnym razie ustawia licznik czasu, aby się sam wywoływał i sprawdzał ponownie za 20 milisekund.


processpaste funkcja:

Funkcja ta zapisana innerHTML z edycji div (który jest teraz wklejone dane) do zmiennej, przywraca innerHTML z edycji div z powrotem do pierwotnej wartości, a ostrzec wklejone dane. Oczywiście w prawdziwym scenariuszu użytkowania prawdopodobnie chciałbyś czegoś innego niż tylko dane alarmowe, możesz zrobić tutaj cokolwiek chcesz.

Prawdopodobnie będziesz również chciał uruchomić wklejone dane poprzez pewien proces dezynfekcji danych. Można to zrobić, gdy nadal znajduje się w edytowalnym dziale div lub wyciągniętym łańcuchu.


W prawdziwej sitution będzie prawdopodobnie chcesz, aby przed zapisać ustawienia i przywrócić go później (Set cursor position on contentEditable <div>). Następnie można wstawić wklejone dane w miejscu, w którym znajdował się kursor, gdy użytkownik wkleił akcję wklejania.

P.S. Kombinacja tego kodu, IE < = 8 i jsfiddle, wydaje się nie działać, ale działa np. < = 8 w środowisku innym niż jsfiddle.

+0

To działało, jesteś oszczędny dziękuję bardzo i przepraszam za podjęcie tak, aby oznaczyć go jako poprawną odpowiedź. – trebor

+0

Witam, chcę zmienić ten kod dla obrazów schowka, co mogę zrobić? – altandogan

+0

@ user990513 Powyższy kod już zapisuje obraz ze schowka po stronie klienta do zmiennej. Proszę dalej wyjaśnić, czy źle odczytałem twoje pytanie: –

Powiązane problemy