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 function使用心得
May 10 Javascript
js前台分页显示后端JAVA数据响应
Mar 18 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
Aug 13 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
ECMAScript6中Map/WeakMap详解
Jun 12 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
Oct 26 Javascript
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
详解vue3.0 的 Composition API 的一种使用方法
Oct 26 Javascript
在antd4.0中Form使用initialValue操作
Nov 02 Javascript
基于JavaScript实现简单扫雷游戏
Jan 02 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
preg_match_all使用心得分享
2014/01/31 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
jquery提升性能最佳实践小结
2010/12/06 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
Python动态加载模块的3种方法
2014/11/22 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
python如何代码集体右移
2020/07/20 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
春节活动策划方案
2014/01/24 职场文书
餐厅总厨求职信
2014/03/04 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
小学国庆节活动总结
2015/03/23 职场文书
检讨书模板大全
2015/05/07 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
Python实现列表拼接和去重的三种方式
2021/07/02 Python