如何监控input的内容变化 控制Input只能输入字母

考虑到的事件有:

blur

change

keydown

keypress

keyup

input

textInput

模板代码

<body>
	<input type="text" id="in">
	<div id="out"></div>
	<script type="text/javascript" src="./vue.js"></script>
	<script type="text/javascript" src="./jquery.js"></script>
	<script type="text/javascript">
		$(function(){
			function change(event){
				$('#out').html(this.value);
			}
			$('#in')[0].addEventListener('textInput', change, true);
		});
	</script>
</body>

其中blur和change事件是只有在input失去焦点后才能触发,所以不能实时监控

而keydown事件在字符被输入到input框前就会触发,所以触发时value还没被写入,注意一下

keyup事件只有松开键盘时才能触发,所以如果用户长按某个键,是不能被处理的

textInput的特点是,任何可以获取焦点的元素都可以触发keypress事件,但是textInput只能对可编辑区域产生响应,textInput似乎只能用addEventListener来添加,用ontextInput莫得反应,而且textInput对删除键不响应,同时表现的和keydown差不多,差距一个字母

 

那不妨引申一下,如果我们想要一个输入框,只能输入字母,虽然我们可以用type来达到这个效果,但是我们可以使用js来做这样的限制。

首先我们尝试一下keydown事件,对应event.keyCode检测输入的键值,利用preventDefault阻止字符的输入

<body>
	<input type="text" id="in">
	<div id="out"></div>
	<script type="text/javascript" src="./vue.js"></script>
	<script type="text/javascript" src="./jquery.js"></script>
	<script type="text/javascript">
		$(function(){
			function change(event){
				if(event.keyCode > 90 || event.keyCode < 65){
					event.preventDefault();
				}
			}
			$('#in')[0].addEventListener('keydown', change, true);
		});
	</script>
</body>

结果呢,中文亦可以输入,而且删除键方向键都被屏蔽,属实不行,虽然我们可以通过修改条件来使得不去屏蔽删除键方向键,但是并不能处理中文问题。

我们上面的过程发现删除键并不会触发textInput事件,所以我们可以考虑用他来实现,对应键值是event.data,返回的是输入的符号,比如'a' 'A' 'b',如果是粘贴的话,event.data会是那一段字符串

<body>
	<input type="text" id="in">
	<div id="out"></div>
	<script type="text/javascript" src="./vue.js"></script>
	<script type="text/javascript" src="./jquery.js"></script>
	<script type="text/javascript">
		$(function(){
			function change(event){
				let d = event.data;
				if(!( ( d  <= 'Z' && d >= 'A') || ( d <= 'z' && d >= 'a') )){
					event.preventDefault();
				}
			}
			$('#in')[0].addEventListener('textInput', change, true);
		});
	</script>
</body>

这时候,运行代码,发现,诶,很有意思,删除键和方向键没有被屏蔽,但是我又发现一个问题,如果粘贴的字符串是'A1111'会被允许输入,因为'Z' >='A111' >= 'A',所以可能说我们加入一个length限制比较好,对于中文输入,还是不能被防止,所以还是考虑其他手段阻止中文输入比较好。

一个方法是使用css {ime-mode:disabled}会禁止使用输入法,然而chrome不支持,溜了溜了,实在是难,实在不行就每次触发事件后把input元素的value中unicode不属于字母范围的替换为''算了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值