2010-02-11 25 views
13

Tengo que tomar el evento pegar de un área de texto usando JQuery. He probado el siguiente código pero no está funcionando ...Capturar texto pegado en un área de texto con JQuery

$(document).ready(function() 
{ 
    $('#txtcomplaint').keyup(function() 
    { 
    TextCounter('txtcomplaint','counterComplaint', 1000); 
    }) 
    $('#txtcomplaint').onpaste(function() 
    { 
    alert() 
    //TextCounter('txtcomplaint','counterComplaint', 1000); 
    }) 
}); 

Respuesta

21

Puede hacer algo como esto

$("#txtcomplaint").bind('paste', function(e) { 
    var elem = $(this); 

    setTimeout(function() { 
     // gets the copied text after a specified time (100 milliseconds) 
     var text = elem.val(); 
    }, 100); 
}); 
+0

Este método funciona si presiona Ctrl + V para pegar. Pero no funciona si haces clic con el botón derecho del mouse y seleccionas Pegar. – JohnnyLinTW

+6

Encontré si el cambio a $ ("# txtcomplaint"). Bind ('pegar', nulo, función (e) ... y funciona bien para Ctrl + V y pegar el mouse. – JohnnyLinTW

6
$('#txtcomplaint').bind('paste', function(e){ alert('pasting!') }); 

Por recurso adicional echar un vistazo here.

+0

No obtendrá el texto copiado con este método. – rahul

+0

@rahul: Él solo quiere usar este evento para el mapeo de conteo de texto. –

1

finalmente conseguí que esto funcione para 1) la especificación, 2) arrastrar y soltar, 3) Ctrl-V y 4) Pegar en el menú contextual de un ratón clic, pero tenía que colocar la pasta y colocar los manipuladores al documento (donde 'taValue' es la clase de las áreas de texto que estoy tratando de controlar):

 $(document).on("paste drop", '.taValue', function (e) { 
      myHandler.call(e.target, e); 
     }); 

el evento keyup en el área de texto ya ha trabajado. El siguiente problema es que los eventos de pegar y soltar se disparan ANTES de que el texto en el área de texto realmente cambie. En mi caso, quería comparar el nuevo texto con el texto original. Recurrí a un setTimeout:

function myHandler(e) { 
     if (e && (e.type === "drop" || e.type === "paste")) { 
     var me = this; 
     setTimeout(function() { myHandler.call(me) }, 200); 
     }... [more code to do the comparison] 

No me gusta usar los tiempos de espera para este tipo de cosas, pero funciona (cuando trataba de un intervalo de 100 ms, no lo hizo).

0

Ésta es la solución más útil:

$("#item_name").bind("input change", function() {}); 

tal cambio no es esencial.

Cuestiones relacionadas