2012-08-27 11 views
13

So che possiamo usare pasta bind evento come di seguito:richiamare una funzione dopo destro pasta click in jQuery

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

ma il problema è, che sarà chiamare prima la pasta testo incollato. Voglio che una funzione venga attivata dopo il tasto destro del mouse su -> incollare il testo incollato sul campo di input, in modo da poter accedere al valore incollato all'interno della funzione del gestore eventi.

.change() evento non aiuta. Attualmente io uso l'evento .keyup(), perché ho bisogno di mostrare il conteggio dei caratteri rimanenti durante la digitazione in quel campo di input.

+1

E il listener di eventi 'oninput' HTML5? –

risposta

23

Tipo di un hack, ma:

$("#id").bind('paste', function(e) { 
     var ctl = $(this); 
     setTimeout(function() { 
      //Do whatever you want to $(ctl) here.... 
     }, 100); 
}); 
+0

Anche questa è stata la mia intuizione. –

0

Ho avuto lo stesso problema, ho optato per replicare l'azione pasta tramite JavaScript e utilizzare tale uscita invece:

var getPostPasteText = function (element, pastedData) { 
    // get the highlighted text (if any) from the element 
    var selection = getSelection(element); 
    var selectionStart = selection.start; 
    var selectionEnd = selection.end; 

    // figure out what text is to the left and right of the highlighted text (if any) 
    var oldText = $(element).val(); 
    var leftPiece = oldText.substr(0, selectionStart); 
    var rightPiece = oldText.substr(selectionEnd, oldText.length); 

    // compute what the new value of the element will be after the paste 
    // note behavior of paste is to REPLACE any highlighted text 
    return leftPiece + pastedData + rightPiece; 
}; 

Vedi IE's document.selection.createRange doesn't include leading or trailing blank lines per fonte della funzione getSelection.

3

Questo fermerà utente da qualsiasi incollare, affrontare o il taglio con la tastiera:

$("#myField").keydown(function(event) { 
    var forbiddenKeys = new Array('c', 'x', 'v'); 
    var keyCode = (event.keyCode) ? event.keyCode : event.which; 
    var isCtrl; 
    isCtrl = event.ctrlKey 

    if (isCtrl) { 
     for (i = 0; i < forbiddenKeys.length; i++) { 
      if (forbiddenKeys[i] == String.fromCharCode(keyCode).toLowerCase()) { 
      return false; 
     } 
    } 
} 
return true; 
}); 

Questo farà lo stesso per gli eventi del mouse:

$("#myField").bind("cut copy paste",function(event) { 
    event.preventDefault(); 
}); 

Anche se quanto precede lo farà non impedire clic destro, l'utente non sarà in grado di incollare, tagliare o copiare da quel campo.

di usarlo dopo l'evento, come vi siete chiesti sulla tua domanda, è necessario utilizzare JavaScript Timing Event

setTimeout(function() { 
    // your code goes here 
}, 10); 
13

Perché non utilizzare l'evento "input"?

$("#id").bind('input', function(e) { 
    var $this = $(this); 
    console.log($this.val()); 
}); 
+1

non ho mai saputo che c'era un evento chiamato 'input': D, questa dovrebbe essere la risposta corrente al posto della risposta 'timeout' – Exlord

+0

ottima risposta. Grazie! –

+0

In aumento! Questa dovrebbe essere la risposta accettata. L'evento oninput si verifica dopo che l'incolla è stata completata, dopo che qualsiasi carattere (i) è stato aggiunto all'input. In linea puoi fare ciò DiscipleMichael

Problemi correlati