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实现二分查找法实现代码
Nov 12 Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
jQuery应用之jQuery链用法实例
Jan 19 Javascript
JavaScript重定向URL参数的两种方法小结
Oct 19 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
jQuery中绑定事件bind() on() live() one()的异同
Feb 23 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 Javascript
bootstrap table实现合并单元格效果
Dec 24 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
May 20 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
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中的(伪)多线程与多进程
2013/07/01 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
js实时监听文本框状态的方法
2011/04/26 Javascript
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
python+Django+apache的配置方法详解
2016/06/01 Python
使用C++扩展Python的功能详解
2018/01/12 Python
基于Python List的赋值方法
2018/06/23 Python
python保存网页图片到本地的方法
2018/07/24 Python
python使用插值法画出平滑曲线
2018/12/15 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
公司中层干部的自我评价分享
2014/03/01 职场文书
承诺书范文
2014/06/03 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
公务员年度个人总结
2015/02/12 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
导游词之临安白水涧
2019/11/05 职场文书
python OpenCV学习笔记
2021/03/31 Python
python tkinter实现定时关机
2021/04/21 Python