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 相关文章推荐
js对象与打印对象分析比较
Apr 23 Javascript
使用js操作cookie的一点小收获分享
Sep 03 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
js中string和number类型互转换技巧(分享)
Nov 28 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
angularJs中$http获取后台数据的实例讲解
Aug 08 Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 Javascript
javascript Canvas动态粒子连线
Jan 01 Javascript
JavaScript如何使用插值实现图像渐变
Jun 28 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
php经典算法集锦
2015/11/14 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
浅析return false的正确使用
2013/11/04 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
使用python开发vim插件及心得分享
2014/11/04 Python
Python网络爬虫实例讲解
2016/04/28 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
儿童编程python入门
2018/05/08 Python
Numpy数据类型转换astype,dtype的方法
2018/06/09 Python
python三引号输出方法
2019/02/27 Python
python实现图像拼接
2020/03/05 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
销售经理竞聘书
2014/03/31 职场文书
项目投资合作意向书
2014/07/29 职场文书
学校食品安全责任书
2015/01/29 职场文书
爱心捐书倡议书
2015/04/27 职场文书
单位政审意见范文
2015/06/04 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
php中pcntl_fork详解
2021/04/01 PHP
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python