HTML5标准事件oninput实现输入检测 – Falost的小窝

HTML5标准事件oninput实现输入检测

HTML5 神棍 433℃ 0评论

以往我们实现input的输入监听用到的无非是onkeyup、onkeydown、onchange,但是这些都有着一些不好的用户体验。比如onchange事件只在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效;而onkeydown、onkeyup在处理复制、粘贴、拖拽、长按键(按住键盘不放)等细节上并不完善。

onpropertychange属性可在某些情况下解决上面存在的问题,不用考虑是否失去焦点,不管js操作还是键盘鼠标手动操作,只要HTML元素属性发生改变即可立即捕获到。遗憾的是,onpropertychange为IE专属的。其他浏览器下如果想要实现这一实时监听的需求,就要用到HTML5中的标准事件oninput,不过IE9以下的浏览器是不支持oninput事件的。如果要兼容IE9以下浏览器,就需要oninput和onpropertychange一起使用。

如下实例:

<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="Author" content="神棍、Falost">
		<title>hello world!</title>
		<style type="text/css">
			#box{
				width:100%;
				height:30px;
			}
		</style>
	</head>
	<body>
		<div id="box"></div>
		<input type="text" oninput="Monitor(this)" onpropertychange="Monitor(this)"/>
		
		<script type="text/javascript">
			function Monitor(t){
				console.log(t.value)
				var box = document.getElementById('box')
				box.innerHTML = '你当前输入的是:'+ t.value
			}
		</script>
	</body>
</html>

实时监听input中输入内容的变化。

 

oninput的定义和用法

oninput 事件在用户输入时触发。

该事件在 <input> 或 <textarea> 元素的值发生改变时触发。

提示: 该事件类似于 onchange 事件。不同之处在于 oninput 事件在元素值发生变化是立即触发, onchange 在元素失去焦点时触发。另外一点不同是 onchange 事件也可以作用于 <keygen> 和 <select> 元素。

浏览器支持

表格中的数字表示支持该事件的第一个浏览器的版本号。

事件 Chrome IE Firefox  Safari Opera
oninput Yes 9.0 4.0 5.0 Yes

技术细节

是否支持冒泡: Yes
是否可以取消: No
事件类型: Event
支持的 HTML 标签: <input type="password">, <input type="search">, <input type="text"> 和 <textarea>

一个基于JQuery的oninput和onpropertychanged的使用案例,实时监听textarea中的输入字数:

<!doctype html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="Author" content="神棍、Falost">
		<title>hello world!</title>
		<script type="text/javascript" src="http://localhost:3000/static/libs/jquery/dist/jquery.min.js"></script>
		<style type="text/css">
			.box{
				position:relative;
				width:50%;
				height:100px;
				margin:auto;
			}
			.commentTextArea{
				width: 100%;
				height: 100%;
				padding-top: 20px;
			}
			.comments{
				width: 100%;
				max-width:100%;
				height: 100%;
			}
			.commentTextCount{
				position: absolute;
				top: 0;
				right: 0;
			}
			.count_alarm{
				color:red;
			}
		</style>
	</head>
	<body>
		<div class="box">
			<div class="commentTextArea">
				<textarea name="comment" id="comments" class="comments" maxlength="300"
                      placeholder="看点槽点,不吐不快!别憋着,马上大声说出来吧!"></textarea>
			</div>
			<div class="commentTextCount">
				<span class="count">0</span>
				<span>/300</span>
			</div>
		</div>
		<script type="text/javascript">
			$("#comments").focus(function(){
				counts(this)
			})
			function counts(t){
			  $(t).on('input propertychange', function () {
				var maxLength = $(t).maxLength
				var counts = $(t).parent().siblings('.commentTextCount ').children(".count")
				var count = $(t).val().length
				counts.text(count)
				if(count > maxLength){
				  counts.addClass('count_alarm')
				}else{
				  counts.removeClass('count_alarm')
				}
			  })
			}
		</script>
	</body>
</html>

 

oninput事件与onpropertychange事件的区别: 

oninput事件是IE之外的大多数浏览器支持的事件,在value改变时触发,实时的,即每增加或删除一个字符就会触发,然而通过js改变value时,却不会触发;onpropertychange事件是任何属性改变都会触发的,而oninput却只在value改变时触发,oninput要通过addEventListener()来注册,onpropertychange注册方式跟一般事件一样。(此处都是指在js中动态绑定事件,以实现内容与行为分离)

oninput与onpropertychange失效的情况:

(1)oninput事件:a). 当脚本中改变value时,不会触发;b).从浏览器的自动下拉提示中选取时,不会触发。
(2)onpropertychange事件:当input设置为disable=true后,onpropertychange不会触发。

转载请注明:Falost的小窝 » HTML5标准事件oninput实现输入检测

如果你觉得这篇文章不错或者对你有帮助,想请我喝一杯咖啡,可以打赏
喜欢 (5)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址