js监听表单value的修改同步问题,跨浏览器支持


Posted in Javascript onDecember 31, 2009

想要实现的功能大概是这样的:
有两个文本框,其中一个只读,另一个可以输入。要求在可输入文本框中输入文本时,只读文本框能够获得输入的值,且只读文本框旁边出现提示信息,实时显示只读文本框的内容。
这个功能看是简单,但其实并没有想象的那么简单。(注意,可输入框的处理没什么可讨论的,关键是只读框的处理)

一开始,我们一般会想到在只读文本框上运用onchange事件。一试,发现onchange根本没用,该事件是在文本框获得焦点,然后内容改变失去焦点后才触发的,现在在只读文本框上根本没有这些,它的内容是通过js改变的。于是,需要寻找另外的方法。

这时,在网上找到了onpropertychange事件。该事件在文本框属性改变时触发,不管是通过什么方式改变的。注意,是属性改变,而不仅仅是value改变。一试,果然好使。然而,这个事件是IE专有的。WEB开发,必须得考虑浏览器的兼容问题。于是继续摸索……

在网上有看到了另外一个事件:oninput。网上到处都是:fireFox中的该事件与IE中onpropertychange的事件等同。然而,我一试,发现根本不等同。oninput事件在fireFox中似乎没有起作用。经过一段时间测试,终于明白,原来oninput并非与onpropertychange等同(网上到处到处乱转贴,也不认真测试一下)。oninput只在用户输入值改变时触发(即value改变),并非所有属性改变时触发,而且,通过js改变value时,oninput不会触发。这下郁闷了。好不容易看到点希望,又再次陷入了失望,还好没有绝望……哎,浏览器兼容问题真是麻烦。

左思右想,总有又有了眉目。对于fireFox等浏览器,可以通过定时器检查只读文本框的内容是否改变。测试后,终于大功告成。下面把代码贴出来与大家分享。

在IE中的效果:

js监听表单value的修改同步问题,跨浏览器支持

FireFox中的效果图:

js监听表单value的修改同步问题,跨浏览器支持

另外,我还在google Chrome测试也成功了(跟fireFox一样的)。

HTML代码:

<table> 
            <tr> 
                <td>此处值通过js设置:</td> 
                <td><input id="jsUserName" type="text" name="jsUserName" readonly/></td> 
            </tr> 
            <tr> 
                <td>此处输入值:</td> 
                <td><input id="userName" type="text" name="userName"/></td> 
            </tr> 
        </table>

JavaScript代码:
$(function() 
        { 
            var jsUserName = ""; 
            if($.browser.msie)    // IE浏览器 
            { 
                $("#userName").get(0).onpropertychange = setJsUserName; 
                $("#jsUserName").get(0).onpropertychange = handle; 
            } 
            else    // 其他浏览器 
            { 
                var intervalName;    // 定时器句柄 
                $("#userName").get(0).addEventListener("input",setJsUserName,false);                 // 获得焦点时,启动定时器 
                $("#userName").focus(function(){ 
                    intervalName = setInterval(handle,1000); 
                }); 
                // 失去焦点时,清除定时器 
                $("#userName").blur(function() 
                { 
                    clearInterval(intervalName); 
                }); 
            } 
            // 设置jsUserName input的值 
            function setJsUserName() 
            { 
                $("#jsUserName").val($(this).val()); 
            } 
            // jsUserName input的值改变时执行的函数 
            function handle() 
            {     
                // IE浏览器此处判断没什么意义,但为了统一,且提取公共代码而这样处理。 
                if($("#jsUserName").val() != jsUserName) 
                { 
                    $("#toolTip").remove(); 
                    $("#jsUserName").parent().append("<span id='toolTip'>看到这里的信息表明,通过js改变input的值也能响应相应事件:<span style="color:red;" style="color:red;">" + $("#jsUserName").val() + "</span></span>"); 
                    jsUserName = $("#jsUserName").val(); 
                } 
            } 
        });

说明:为了方便,js代码使用了jQuery。不使用是一样的。
另外,考虑性能问题,可以考虑何时启动定时器和清除定时器以及定时器延时时间。
总结:
1、onchange事件与onpropertychange事件的区别:
onchange事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发;onpropertychange事件却是实时触发,即每增加或删除一个字符就会触发,通过js改变也会触发该事件,但是该事件IE专有。
2、oninput事件与onpropertychange事件的区别:
oninput事件是IE之外的大多数浏览器支持的事件,在value改变时触发,实时的,即每增加或删除一个字符就会触发,然而通过js改变value时,却不会触发;onpropertychange事件是任何属性改变都会触发的,而oninput却只在value改变时触发,oninput要通过addEventListener()来注册,onpropertychange注册方式跟一般事件一样。(此处都是指在js中动态绑定事件,以实现内容与行为分离)
3、oninput与onpropertychange失效的情况:
(1)oninput事件:a). 当脚本中改变value时,不会触发;b). 从浏览器的自动下拉提示中选取时,不会触发。
(2)onpropertychange事件:当input设置为disable=true后,onpropertychange不会触发。
如有问题或本人写的不正确的地方欢迎联系或指正。
Javascript 相关文章推荐
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
Feb 14 Javascript
终于解决了IE8不支持数组的indexOf方法
Apr 03 Javascript
jquery 利用show和hidden实现级联菜单示例代码
Aug 09 Javascript
javascript中如何处理引号编码&amp;#034;
Aug 15 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
Nov 17 Javascript
Vue 仿百度搜索功能实现代码
Feb 16 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
轻松实现jQuery添加删除按钮Click事件
Mar 13 Javascript
整理关于Bootstrap表单的慕课笔记
Mar 29 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
Jul 02 Javascript
微信小程序登录session的使用
Mar 17 Javascript
js跟随滚动条滚动浮动代码
Dec 31 #Javascript
Javascript的匿名函数小结
Dec 31 #Javascript
JavaScript 对Cookie 操作的封装小结
Dec 31 #Javascript
Javascript的闭包
Dec 31 #Javascript
javascript Onunload与Onbeforeunload使用小结
Dec 31 #Javascript
JavaScript 常用函数
Dec 30 #Javascript
jQuery的三种$()
Dec 30 #Javascript
You might like
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP中的session安全吗?
2016/01/22 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
php创建类并调用的实例方法
2019/09/25 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
js实现二级导航功能
2017/03/03 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
linux下安装easy_install的方法
2013/02/10 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
通过实例解析python描述符原理作用
2020/01/22 Python
学习心得体会
2014/01/01 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
作弊检讨书
2015/01/27 职场文书