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 相关文章推荐
基于jquery+thickbox仿校内登录注册框
Jun 07 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
Jan 04 Javascript
在javascript中对于DOM的加强
Apr 11 Javascript
JSON无限折叠菜单编写实例
Dec 16 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
JavaScript使用Range调色及透明度实例
Sep 25 Javascript
JavaScript面向对象继承原理与实现方法分析
Aug 09 Javascript
Vue 监听列表item渲染事件方法
Sep 06 Javascript
在Webpack中用url-loader处理图片和字体的问题
Apr 28 Javascript
vue项目中使用bpmn-自定义platter的示例代码
May 11 Javascript
vue v-model的用法解析
Oct 19 Javascript
three.js如何实现3D动态文字效果
Mar 03 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
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
PDO::setAttribute讲解
2019/01/29 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
Node.js中的child_process模块详解
2018/06/08 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
python对url格式解析的方法
2015/05/13 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python的几种主动结束程序方式
2019/11/22 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
2014年教务工作总结
2014/12/03 职场文书
办公室禁烟通知
2015/04/23 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书