Ответ 1
Поскольку событие paste
инициируется до обновления входного значения, решение заключается в следующем:
-
Вместо этого захватывайте данные из буфера обмена, так как данные буфера обмена будут точно такими же, как данные, вставленные во входные данные в тот момент.
-
Подождите, пока значение не обновится с помощью таймера
К счастью, спустя годы после публикации оригинального ответа, большинство современных браузеров теперь поддерживают фантастический API буфера обмена, гораздо более элегантное решение для сбора данных из буфера обмена.
Для браузеров, которые не поддерживают API буфера обмена, мы можем обратиться к ненадежному event.clipboardData
если мы event.clipboardData
, какая версия, если таковая имеется, поддерживается в браузере.
В качестве окончательного отступления, использование таймера для задержки до обновления входного значения будет работать во всех браузерах, что делает его по-настоящему кросс-браузерным решением.
Я сделал удобную функцию, которая обрабатывает все
function catchPaste(evt, elem, callback) {
if (navigator.clipboard && navigator.clipboard.readText) {
// modern approach with Clipboard API
navigator.clipboard.readText().then(callback);
} else if (evt.originalEvent && evt.originalEvent.clipboardData) {
// OriginalEvent is a property from jQuery, normalizing the event object
callback(evt.originalEvent.clipboardData.getData('text'));
} else if (evt.clipboardData) {
// used in some browsers for clipboardData
callback(evt.clipboardData.getData('text/plain'));
} else if (window.clipboardData) {
// Older clipboardData version for Internet Explorer only
callback(window.clipboardData.getData('Text'));
} else {
// Last resort fallback, using a timer
setTimeout(function() {
callback(elem.value)
}, 100);
}
}
// to be used as
$('#myid').on('paste', function(evt) {
catchPaste(evt, this, function(clipData) {
console.log(clipData);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="myid" />