js监听输入框值的即时变化onpropertychange、oninput


Posted in Javascript onJuly 13, 2011

要达到的效果
很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感。比如即时显示输入框已经被输入的字节数,或者即时读取输入的值来进行搜索引导,也就是google的关联搜索效果等。
只要我们能捕获即时事件就能做到很多事情。
需要了解的知识
首先,我们需要了解onchange和onpropertychange的不同:
IE下,当一个HTML元素的属性改变的时候,都能通过 onpropertychange来即时捕获。
onchange在属性值改变时还必须使得当前元素失去焦点(onblur)才可以激活该事件。
了解这一点后我们发现onpropertychange的效果就是我们想要的,可是很遗憾,它只在IE下有效果。我们能不能找到另外一个时间来代替onpropertychange呢?
经过翻阅资料得知,在其他浏览器下可以使用oninput事件来达到同样的效果,真是太好了,我们只需要把IE浏览器区分出来就可以。
oninput的使用
下面我们先了解一下oninput如何使用。

如果您是将注册时间直接写在页面里面,那么如下写法就可以实现:
<input type="text" name="textfield" oninput="alert(this.value);" onpropertychange="alert(this.value)" />
但是,将oninput写在JS代码中分离出来时与普通事件注册的方法有些不同,必须使用addEventListener来注册。
attachEvent和addEventListener 的不同
说到这里我们再来了解一下 attachEvent和addEventListener 的使用方法:
attachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)
addEventListener方法 用于 Mozilla系列
举例:
document.getElementById("btn").onclick = method1;
document.getElementById("btn").onclick = method2;
document.getElementById("btn").onclick = method3;
如果这样写,那么将会只有medhot3被执行
写成这样:
var btn1Obj = document.getElementById("btn1");
btn1Obj.attachEvent("onclick",method1);
btn1Obj.attachEvent("onclick",method2);
btn1Obj.attachEvent("onclick",method3);
执行顺序为method3->method2->method1
如果是Mozilla系列,并不支持该方法,需要用到addEventListener
var btn1Obj = document.getElementById("btn1");
btn1Obj.addEventListener("click",method1,false);
btn1Obj.addEventListener("click",method2,false);
btn1Obj.addEventListener("click",method3,false);
执行顺序为method1->method2->method3
了解了如何使用addEventListener来注册oninput事件后我们再回到要解决的问题[划分浏览器]。
判断IE浏览器
如何将IE区分出来呢?
这似乎是一个老生常谈的问题,网络中有很多找那个方法,归类为两类:
其一,是判断浏览器的功能属性。
其二,就是判断传统的 user-agent 字符串,这可能是最古老也是最流行的检测方式。
在这里就不做深入了解了,我们这里用一种比较简单的方法来判断

if("\v"=="v") { 
alert("IE"); 
}else{ 
alert("NO"); 
}

到目前为止我们遇到的问题就已经解决了,开始写代码来测试我们的思路是否能够实现。
完成代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<meta name="auther" content="fq" /> 
<title>监听输入框值的即时变化 onpropertychange oninput</title> 
<script type="text/javascript"> 
function immediately(){ 
var element = document.getElementById("mytext"); 
if("\v"=="v") { 
element.onpropertychange = webChange; 
}else{ 
element.addEventListener("input",webChange,false); 
} 
function webChange(){ 
if(element.value){document.getElementById("test").innerHTML = element.value}; 
} 
} 
</script> 
</head> 
<body>

直接写在页面中的示例:
<input type="text" name="textfield" oninput="document.getElementById('webtest').innerHTML=this.value;" onpropertychange="document.getElementById('webtest').innerHTML=this.value;" /> 
<div>您输入的值为:<span id="webtest">还未输入</span></div> 
<br /><br /><br /><br /><br /> 
写在JS中的示例: 
<input type="text" name="textfield" id="mytext" /> 
<div>您输入的值为:<span id="test">还未输入</span></div> 
<script type="text/javascript"> 
immediately(); 
</script> 
</body> 
</html>

太漂亮了,一次完成,预览以上代码,页面中共实现两两种方式:第一、页面中直接引用;第二、JS中引用。
经过测试,兼容:IE6、IE7、IE8、Firefox、Opera、Chrome、Safari
Javascript 相关文章推荐
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
jQuery DOM操作小结与实例
Jan 07 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
Feb 01 Javascript
基于jquery中children()与find()的区别介绍
Apr 26 Javascript
JavaScript中检测变量是否存在遇到的一些问题
Nov 11 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
js实现从左向右滑动式轮播图效果
Jul 07 Javascript
react 应用多入口配置及实践总结
Oct 17 Javascript
Vue项目中配置pug解析支持
May 10 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 Javascript
vue实现信息管理系统
May 30 Javascript
js 判断脚本加载完毕的代码
Jul 13 #Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
Jul 13 #Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
Jul 13 #Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 #Javascript
JS模拟面向对象全解(一、类型及传递)
Jul 13 #Javascript
一些实用的jQuery代码片段收集
Jul 12 #Javascript
formValidator3.3的ajaxValidator一些异常分析
Jul 12 #Javascript
You might like
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
两种php实现图片上传的方法
2016/01/22 PHP
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python遍历小写英文字母的方法
2019/01/02 Python
Django中Middleware中的函数详解
2019/07/18 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
python数字类型math库原理解析
2020/03/02 Python
基于python实现计算两组数据P值
2020/07/10 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
高一英语教学反思
2014/01/22 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
推销搭讪开场白
2015/05/28 职场文书