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 相关文章推荐
菜单效果
Oct 14 Javascript
JavaScript的单例模式 (singleton in Javascript)
Jun 11 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
Dec 06 Javascript
基于jquery的多功能软键盘插件
Jul 25 Javascript
jquery增加时编辑jqGrid(实例代码)
Nov 08 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
详解JavaScript中循环控制语句的用法
Jun 03 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
从零学习node.js之模块规范(一)
Feb 21 Javascript
vue中的ref和$refs的使用
Nov 22 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 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP _construct()函数讲解
2019/02/03 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
PHP实现倒计时功能
2020/11/16 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
js中document.write的那点事
2014/12/12 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python队列Queue的详解
2019/05/10 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
请解释接口的显式实现有什么意义
2012/05/26 面试题
普罗米修斯教学反思
2014/02/06 职场文书
优秀团员事迹材料
2014/12/25 职场文书
先进党组织事迹材料
2014/12/26 职场文书
党小组评议意见
2015/06/02 职场文书
暂住证证明
2015/06/19 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android