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 ajax serialize()方法的使用以及常见问题解决
Jan 27 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
Aug 18 Javascript
js中小数转换整数的方法
Jan 26 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
JS解决iframe之间通信和自适应高度的问题
Aug 24 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
Jan 11 Javascript
JS对象创建的几种方式整理
Feb 28 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
Jul 15 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
Aug 24 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
Vue项目服务器部署之子目录部署方法
May 12 Javascript
vue使用watch监听属性变化
Apr 30 Vue.js
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实现用户认证及管理完全源码
2007/03/11 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
解析PHP高效率写法(详解原因)
2013/06/20 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
jquery 指南/入门基础
2007/11/30 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
python实现的一个p2p文件传输实例
2014/06/04 Python
python开发之str.format()用法实例分析
2016/02/22 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
python实时监控logstash日志代码
2020/04/27 Python
Otel.com:折扣酒店预订
2017/08/24 全球购物
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
什么是抽象
2015/12/13 面试题
小学生红领巾广播稿
2014/01/21 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle