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 相关文章推荐
javascript delete 使用示例代码
Mar 29 Javascript
让浏览器非阻塞加载javascript的几种方法小结
Apr 25 Javascript
实现动画效果核心方式的js代码
Sep 27 Javascript
详解JS 比较两个Json对象的值是否相等的实例
Nov 20 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
JavaScript中Function函数与Object对象的关系
Dec 17 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
Javascript前端经典的面试题及答案
Mar 14 Javascript
Angular CLI 安装和使用教程
Sep 13 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
详解js加减乘除精确计算
Mar 19 Javascript
angular2 NgModel模块的具体使用方法
Apr 10 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创建Cookie数组的详解
2013/07/03 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php实现webservice实例
2014/11/06 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
浅谈AngularJS中ng-class的使用方法
2016/11/11 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
司机的工作范围及职责
2013/11/13 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
工程部岗位职责
2015/02/10 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL