jQuery using event.preventDefault() with on('input')
jQuery using event.preventDefault() with on('input')
我正在用$('selector').on('input', function(event) { ... });
捕捉粘贴事件
然后我试着测试粘贴的内容,如果它没有通过验证,用event.preventDefault()
取消粘贴。不幸的是,在执行侦听器函数时,文本已经被粘贴,event.preventDefault()
没有做任何事情。
那么捕获粘贴事件的好方法是什么,如果粘贴的内容不有效,撤销/阻止粘贴?
我知道我可以使用.on('paste', function(event) { ... })
,但这并没有给我粘贴后的文本或输入元素的内容,除非我使用setTimeout()
与一些分钟的等待时间,我想避免使用setTimeout()
。
首先介绍一下input
元素的事件触发顺序:
keydown -> keypress -> paste -> input -> keyup -> change
当你调用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
,否则什么都不做。这样可以避免在输入中手动设置值并随后触发事件。
尝试使用jquery的。change event .
如果value不满足条件,将value设置为空白
使用
$('selector').on('input', function(event) { ... });
,如果验证不通过,删除粘贴的文本似乎对我有用。
遗憾的是访问剪贴板有一些缺陷(浏览器询问是否允许检查剪贴板,跨浏览器兼容性等)
如果您可以保存输入的最后一个值,粘贴的文本无论如何都可以计算。
下面是我计算粘贴文本 的方法https://jsfiddle.net/f710o9qd/2/
我希望这对你有帮助:)
(如果您发现任何缺陷,可以随意改进粘贴文本的计算)
我对这个问题的理解是,我们必须不允许任何数据粘贴到文本框中,除非它通过了特定的验证。代替使用event.preventDefault()
,我们可以在用户输入任何内容时捕获值,使用on('input')
侦听器并根据特定条件验证它,如果验证失败,则清空文本框值。
(如果我们仍然需要使用on('input')
事件监听器,这是一个解决方案)
console.log()
打印粘贴的值):