首先是input
元素事件触发顺序的一些背景知识:
keydown -> keypress -> 粘贴 -> 输入 -> keyup -> 更改
每当您调用preventDefault
它时,它就会停止链条,就像什么都没发生一样。
所以我的建议是捕捉粘贴事件,防止其默认行为并在那里执行您的逻辑。
我知道我可以使用 .on('paste', function(event) { ... }),但这并没有给我粘贴的文本或粘贴后输入元素的内容
实际上,您可以检索剪贴板的内容。请参阅此文档。支持所有主流浏览器(但仅 IE11+)。我不知道在撰写问题时此功能是否可用。
小提琴示例
$('#myInput').on('paste', function(e) {
// Cancel the event - this prevents the text from being entered into the input and stops the event chain
e.preventDefault();
// Get the content of the clipboard
let paste = (event.clipboardData || window.clipboardData).getData('text');
// Validate what it is pasted
if (paste == "text to paste") {
// If condition is satisfied manually set the value of the input
$(this)
.val(paste)
// Manually trigger events if you want
.trigger('input')
.trigger('change');
}
});
代码注释:
- 此解决方案不包括
setTimeout
. 每当您使用它时,setTimeout
您会在很短的时间内看到正在粘贴的文本,就像闪烁的效果一样。
- 如果文本符合条件,我手动将其设置在
input
. 但是,这不会触发input
和change
事件。如果您需要它们,只需手动触发它们
- 类似的方法是先检查文本,如果不符合要求则调用
preventDefault
,否则什么也不做。这样您就可以避免在输入中手动设置值并在之后触发事件。