Перехватить вставку события в Javascript
Есть ли способ перехватить событие вставки в JavaScript и получить необработанное значение, изменить его и установить значение связанного элемента DOM равным измененному значению?
Например, у меня есть пользователь, пытающийся скопировать и вставить строку с пробелами в ней, и длина строки превышает максимальную длину моего текстового поля. Я хочу перехватить текст, удалить пробелы, а затем установить значение текстового поля со значением изменения.
Это возможно?
4 ответа
Вы можете перехватить событие вставки, прикрепив обработчик "onpaste" и получить вставленный текст с помощью "window.clipboardData.getData('Text')
"в IE или"event.clipboardData.getData('text/plain')
"в других браузерах.
Например:
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.
};
Как отмечает @pimvdb, вам нужно будет использовать "e.originalEvent.clipboardData
"при использовании jQuery.
Как это случилось, я ответил на аналогичный вопрос ранее сегодня. Короче говоря, вам нужен хак, чтобы перенаправить каретку на текстовую область вне экрана, когда происходит событие вставки.
$(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');
}
});
Мне нужно было реализовать "обрезку" на том, что было вставлено (убрать все начальные и конечные пробелы), в то же время позволяя использовать пробел.
Для Ctrl+V, Shift+Insert и щелчка правой кнопкой мыши на Paste, вот что я нашел работающим в FF, IE11 и Chrome по состоянию на 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, ''));
}
});
});
Два предостережения:
Если при вставке уже есть текст, обрезка выполняется для всего результата, а не только для того, что он вставляется.
Если пользователь вводит пробел или BS или Del, а затем вставляет, обрезка не происходит.