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+数组实现网页上显示时间/星期几的实用方法
Jan 18 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
javascript的事件触发器介绍的实现
Jun 05 Javascript
动态加载js、css的简单实现代码
May 26 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
Dec 07 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
JS原生数据双向绑定实现代码
Aug 14 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
layui使用表格渲染获取行数据的例子
Sep 13 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 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正则走开
2008/03/15 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
js实现表格数据搜索
2020/08/09 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
YUV转为jpg图像的实现
2019/12/09 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
财务会计应届生求职信
2013/11/24 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
销售求职信范文
2014/05/26 职场文书
常务副总经理任命书
2014/06/05 职场文书
求职意向书
2014/07/29 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
中秋节祝酒词
2015/08/12 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书