2013-06-05 4 views
8

Sto provando a scrivere del codice per Safari per gestire l'evento "paste", ma non sembra funzionare correttamente. Secondo il riferimento DOM di WebKit, oncut, onpaste e oncopy vengono gestiti più o meno come suggerisce l'API per appunti W3C. Tuttavia, non funziona come mi aspetto. Sto incollando i dati delle immagini, ma per quanto ne so, il problema che sto avendo riguarda qualsiasi tipo di incolla. Questo jsfiddle funziona bene in Chrome, ma non in Safari 6.0.4 su OSX.Safari gestisce correttamente l'evento Incolla?

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

ho provato di nuovo utilizzando solo plain JS. Ancora nessuna gioia:

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

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

Se c'è qualche problema con Safari, ovviamente non dovrei aspettarmi che jQuery funzioni. Per quanto posso dire, nel secondo tentativo (semplice) sto facendo esattamente quello che il riferimento WebKit suggerisce che dovrei fare, ma non funziona affatto. Si tratta di una limitazione nota di Safari o il problema tra la sedia e la tastiera?

Aggiornamento: sembra che Safari non implementa la bozza di lavoro del W3C delle API degli Appunti. Sto cercando soluzioni alternative, ma se qualcuno ne conosce una mi piacerebbe ascoltarla.

+1

Sembra Safari ha bisogno di una sorta di area di input in cui è possibile fare accadere la pasta, l'uso di 'contentEditable = true' attiverà l'evento in Safari http://jsfiddle.net/RrP8X/ – Duopixel

+0

@Duopixel perché un commento e non una risposta? Questa è una risposta perfettamente valida (ancora meglio se puoi citare una fonte per questo ...) –

+0

Sarebbe anche preferibile farlo senza impostare contentEditable - questo ha alcuni effetti collaterali indesiderati, come mostrare un cursore textarea sul focus. –

risposta

8

Penso che la risposta, per quanto insoddisfacente, sia "no". Vedere questo WebKit bug:

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

Se la vostra intenzione è quella di ricevere i dati in pasta in qualcosa che non è contentEditable, un input di testo o di un'area di testo, non so di alcun metodo per rendere la versione corrente di Safari fai questo.

Aggiornamento: un tentativo di soluzione in this JSFiddle, semplificato per gestire solo il testo, non funziona in Safari 6.0.5. Tenta un aggiramento in cui un campo di testo nascosto viene automaticamente messo a fuoco quando viene premuto Cmd-V, solo per abilitare l'incollatura in Safari. Impedisce "non è possibile incollare il segnale acustico", ma non viene inviato alcun evento Incolla e non viene inserito nulla nell'input segreto.

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

@Juhana whoops sembra copiato in qualche codice in questa risposta che ho intenzionalmente omesso da esso. Sentiti libero di scrivere una nuova risposta se vuoi rispondere a questa domanda in un modo diverso da quello che ho fatto io. Grazie! :) –

0

Non so se ti aiuta, ma io uso un ingresso out-of-schermo per forzare safari accettare pasta sulla pagina. Mi ha aiutato così qui va:

che sto facendo:

script:

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