Przechwytywanie zdarzenia wklej w Javascript

Czy istnieje sposób, aby przechwycić Zdarzenie paste w JavaScript i uzyskać wartość surową, zmienić ją i ustawić skojarzoną wartość elementu DOM jako zmodyfikowaną wartość?

Na przykład, mam użytkownika próbującego skopiować i wkleić ciąg znaków ze spacjami w nim i długość ciągu przekracza maksymalną długość mojego pola tekstowego. Chcę przechwycić tekst, usunąć spacje, a następnie ustawić wartość pola tekstowego z wartością Zmień.

Czy to możliwe?

Author: mikemaccana, 2011-05-17

4 answers

Możesz przechwycić Zdarzenie paste, dołączając obsługę "onpaste" i uzyskać wklejony tekst za pomocą "window.clipboardData.getData('Text') "W IE lub" event.clipboardData.getData('text/plain')" w innych przeglądarkach.

Na przykład:

var myElement = document.getElementById('pasteElement');
myElement.onpaste = function(e) {
  var pastedText = undefined;
  if (window.clipboardData && window.clipboardData.getData) { // IE
    pastedText = window.clipboardData.getData('Text');
  } else if (e.clipboardData && e.clipboardData.getData) {
    pastedText = e.clipboardData.getData('text/plain');
  }
  alert(pastedText); // Process and handle text...
  return false; // Prevent the default handler from running.
};

Jako notatki @pimvdb, będziesz musiał użyć "e.originalEvent.clipboardData", Jeśli używasz jQuery.

 73
Author: maerics,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 18:56:33
 3
Author: Tim Down,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:48
$(document).ready(function() {
    $("#editor").bind('paste', function (e){
        $(e.target).keyup(getInput);
    });

    function getInput(e){
        var inputText = $(e.target).val();
        alert(inputText);
        $(e.target).unbind('keyup');
    }
});
 1
Author: Cyrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 07:40:11

Musiałem zaimplementować "trim" na tym, co zostało wklejone (usunąć wszystkie początkowe i końcowe białe spacje), jednocześnie zezwalając na użycie spacji.

Dla Ctrl + V, Shift + Insert i wklej prawym przyciskiem myszy, oto co znalazłem działa w FF, IE11 i Chrome od 2017-04-22:

$(document).ready(function() {
    var lastKeyCode = 0;

    $('input[type="text"]').bind('keydown', function(e) {
        lastKeyCode = e.keyCode;
    });
    // Bind on the input having changed.  As long as the previous character
    // was not a space, BS or Del, trim the input.
    $('input[type="text"]').bind('input', function(e) {
        if(lastKeyCode != 32 && lastKeyCode != 8 && lastKeyCode != 46) {
            $(this).val($(this).val().replace(/^\s+|\s+$/g, ''));
        }
    });
});

Dwa zastrzeżenia:

  1. Jeśli podczas wklejania jest już tekst, przycinanie odbywa się na całym wyniku, a nie tylko na tym, co jest wklejane.

  2. Jeśli użytkownik typuje spacja lub BS lub Del, a następnie pasty, przycinanie nie nastąpi.

 0
Author: Craig Silver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 17:42:26