2012-02-29 14 views
24

ho un po 'di problemi la cattura di un testo incollato nel mio ingresso:jquery come ottenere il contenuto incollato

<input type="text" id="myid" val="default"> 
$('#myid').on('paste',function(){ 
     console.log($('#myid').val()); 
}); 

console.log mostra:

default 

Come catch il testo incollato e ottenere pronto all'uso?

+1

C'è una soluzione già [jquery ingresso pasta di cattura] [1], ma che mi sembra non molto buona [1]: http : //stackoverflow.com/questions/686995/jquery-catch-paste-input – kingpin

+0

Perché questo sta andando come commento ??? – kingpin

risposta

31

browser moderni supportano ora l'evento input, che il fuoco dopo che il contenuto è stato incollato

$('#myid').on('input', function() { 
    console.log($('#myid').val()); 
}); 

Quando si incolla ad un ingresso all'evento paste viene licenziato prima che il valore abbia il tempo di aggiornare.
Un modo per risolvere questo è quello di rinviare il recupero del valore fino a quando l'ingresso ha avuto il tempo di aggiornare:

$('#myid').on('paste', function() { 
    setTimeout(function() { 
     console.log($('#myid').val()); 
    }, 100); 
}); 

C'è anche la possibilità di ottenere i dati direttamente dagli appunti, piuttosto che dal valore di input, accedendo a event.clipboardData, tuttavia tale tecnica è sperimentale, non supportata in tutti i browser e, a mio parere, più hacky rispetto all'utilizzo dell'evento input o anche di un semplice timeout.

+1

Perché hai eseguito il timeout di 100 millisecondi, anziché 0? – user2867288

+3

@ user2867288 - 4 anni dopo, non ho idea del perché, l'ho appena fatto? – adeneo

+0

Basta chiedersi se non fosse perché non funziona in alcuni browser, altrimenti (IE), perché idealmente la maggior parte delle persone non vorrebbe aggiungere ritardi inutili nella propria applicazione web. – user2867288

-3

Prova questa o l'aggiunta di un timeout troppo:

$('#myid').on('paste',function(){ 
      console.log(this.value); 
    }); 
41

La risposta accettata è in realtà hacky e brutto, sembra essere suggerito spesso per l'evento pasta su StackOverflow. Credo che un modo migliore per farlo è this

$('#someInput').bind('paste', function(e) { 
    var data = e.originalEvent.clipboardData.getData('Text'); 
    //IE9 Equivalent ==> window.clipboardData.getData("Text"); 
}); 
+4

Questo non funziona in IE 9 per me, ma il metodo 'setTimeout' fa. – BateTech

+3

window.clipboardData.getData ("Testo") <- IE9 equivalente a quanto sopra. –

+0

@toddv, bello. – cateyes

Problemi correlati