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 相关文章推荐
JQuery 写的个性导航菜单
Dec 24 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
TypeScript 学习笔记之基本类型
Jun 19 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
JS Array创建及concat()split()slice()的使用方法
Jun 03 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
Vue中使用vux的配置详解
May 05 Javascript
微信小程序 按钮滑动的实现方法
Sep 27 Javascript
基于Vue实现图片在指定区域内移动的思路详解
Nov 11 Javascript
element-ui组件table实现自定义筛选功能的示例代码
Mar 15 Javascript
vue项目中引入vue-datepicker插件的详解
May 14 Javascript
layui下拉列表select实现可输入查找的方法
Sep 28 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
基于jQuery的js分页代码
2010/06/10 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
django API 中接口的互相调用实例
2020/04/01 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
python爬虫 requests-html的使用
2020/11/30 Python
戴森美国官网:Dyson美国
2016/09/11 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
党员个人思想汇报
2013/12/28 职场文书
物流创业计划书
2014/02/01 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
消防宣传语大全
2015/07/13 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android