2011-08-22 19 views
15

Próbuję wkleić dane schowka do textarea przy użyciu execcommand("paste") z rozszerzeniem chome, ale nie mogę sprawić, żeby działało. uprawnienia są ustawione. Próbowałem ustawić focus() na textarea, ale document.execCommand("paste") nic nie robi i nie otrzymuję błędu. dzwoni execcommand("paste") ze strony w tle również nie robi nic.poprawne użycie polecenia exec ("wklej") w rozszerzeniu chrome

<form> 
    <textarea id="ta"></textarea>  
</form> 
<script type="text/javascript"> 
    document.findElemetById("ta").focus(); 
    document.execCommand("paste"); 
</script> 
+0

Mały obserwacji, ale nie znaczy 'document.getElementById' jako' document.findElementById' nie istnieje? Jestem pewien, że to nie jest problem z twoim prawdziwym kodem, bo to z pewnością spowoduje błąd. – Alasdair

+0

Zobacz także to pytanie: http://stackoverflow.com/questions/6969403/cant-get-execcommandpaste-to-work-in-chrome/7100464#7100464 –

Odpowiedz

33

funkcjonalność Schowek jest kluczowym elementem my extension więc Widziałem wszystkie normalne problemy. Na mojej stronie głównej ujawniam funkcję copy i paste, a sama strona zawiera <textarea id="sandbox"></textarea>;

function copy(str) { 
    var sandbox = $('#sandbox').val(str).select(); 
    document.execCommand('copy'); 
    sandbox.val(''); 
} 

function paste() { 
    var result = '', 
     sandbox = $('#sandbox').val('').select(); 
    if (document.execCommand('paste')) { 
     result = sandbox.val(); 
    } 
    sandbox.val(''); 
    return result; 
} 

Używam jQuery dla uproszczenia, ale masz pomysł. Teraz, gdy chcę korzystać z funkcji schowka, po prostu wywołuje odpowiednią funkcję. Inne strony w moim rozszerzeniu mogą uzyskać dostęp do tego interfejsu API przez chrome.extension.getBackgroundPage(), ale możesz także użyć chrome.runtime.getBackgroundPage(callback), jeśli Twoja strona w tle jest event page.

Nie jestem pewien, czy jest to najlepsza praktyka, czy nawet coś takiego istnieje dla tej funkcjonalności, ale to na pewno działa dla mnie i jest bardzo czyste.

+0

bardzo dziękuję Nie mogłem uzyskać kodu do pracy po wyjęciu z pudełka, ale zmieniając wynik = sandbox.val(); do wynik = $ ("# piaskownica").val(); wykonał sztuczkę – monopoint

+0

Ah, ratownik! Miałem problem polegający na tym, że skopiowałem inny kod, który używał textarea style = 'display: none;' co przestało działać, ale to doskonale działa! – iono

+0

upewnij się, że masz również ustawione uprawnienia. "permissions": ["clipboardWrite"] –

17

To zbyt długo, aby skomentować doskonałą odpowiedź Alasdair, więc tworzę inną odpowiedź. Odpowiedź Alasdair jest doskonała i sprawdziła się znakomicie, ale jako początkujący dodatek do Chrome jeszcze trochę mi zajęło sprawne działanie. Dla każdego, kto znajduje się w podobnej sytuacji, tutaj jest rozwinięcie jego odpowiedzi.

Strony w tle/zdarzenia mogą wchodzić w interakcję ze schowkiem systemowym, o ile zażądano odpowiednich uprawnień. Nie są w stanie wchodzić w interakcję z DOM stron załadowanych przez użytkownika. Skrypty zawartości nie mogą wchodzić w interakcje ze schowkiem systemowym, ale mogą wchodzić w interakcję z DOM stron załadowanych przez użytkownika. Spójrz na numer explanation of the extension architecture, aby uzyskać dobry przegląd tego wszystkiego.

To oznacza, że ​​musisz wykonać operacje kopiowania/wklejania ze schowka systemowego na stronie wydarzenia/tła, co Alasdair opisał powyżej. Wszelkie wklejanie lub kopiowanie z DOM strony, którą przegląda użytkownik, musi nastąpić w twoim skrypcie treści. Oba skrypty są w stanie łatwo komunikować się z message passing.

Mam an extension, którego jedynym celem jest wklejenie, a architektura pochodzi w dużej mierze z tego postu. Jeśli chcesz zobaczyć powyższą technikę w praktyce, take a look at the code. W szczególności background.html, background.js i contentscript.js.

Jeśli naprawdę się spieszysz, here is a gist.

+2

+1 za dostarczenie użytecznego przykładu – schellmax

0
function PasteString() { 
    var editor = document.getElementById("TemplateSubPage"); 
    editor.focus(); 
    // editor.select(); 
    document.execCommand('Paste'); 
} 

function CopyString() { 
    var input = document.getElementById("TemplateSubPage"); 
    input.focus(); 
    // input..select(); 
    document.execCommand('Copy'); 
    if (document.selection) { 
     document.selection.empty(); 
    } else if (window.getSelection) { 
     window.getSelection().removeAllRanges(); 
    } 
} 

nadzieję, że będzie pracować dla Ciebie

Powiązane problemy