js兼容的placeholder属性详解


Posted in Javascript onAugust 18, 2013

作为一个.net后台开发的程序猿,博客里既然大多都是前端相关的博文。是不是该考虑换方向了,转前端开发得了 ...

小小吐槽一下,近期受该不该跳槽所困惑,我有选择困难症!

继续前端,这次说一下输入框 placeholder 这个属性。

html5 的新属性,就是在输入框没输入值的时候,显示的提示文字(自己的理解),例如:

js兼容的placeholder属性详解

貌似很好用,但也只能在支持 html 的浏览器版本中显示,而对于不能支持的浏览器版本,让我这种极力追求完美的开发者来说是很不舒服的一件事。

上网找了很多资料,有很多大牛人都已经有了解决方案了,不过或多或少都有些缺陷,这里我做一个整合和修改:

(忘记看了多少别人的代码了,也忘了地址是什么,在此对其他原作者说声抱歉,若有版权问题请联系我! -.-)

这种扩展,在我看来就像是对浏览器界面功能做一次美容,而我始终坚持,自然的才是最美的。所以在支持这种属性的浏览器版本中,我就不多手再去做其他的修改了。

首先判断是否已支持该属性:

if (!('placeholder' in document.createElement('input'))) { }

如果不支持,工作来了。

取出所有拥有 placeholder 属性的 input:text / input:password / textarea,取出各自的 placeholder 属性值,然后模仿功能,在每一个标签后加一个 label 标签,用来显示 placeholder 的值,当输入值时,清空显示的字符串,当删除输入值时,显示字符串。

var $element = $(this), placeholder = $element.attr('placeholder');
if (placeholder) {
    // 文本框ID
    var elementId = $element.attr('id');
    if (!elementId) {
        var now = new Date();
        elementId = 'lbl_placeholder' + now.getSeconds() + now.getMilliseconds();
        $element.attr('id', elementId);
    }
    // 添加label标签,用于显示placeholder的值
    var $label = $('<label>', {
        html: $element.val() ? '' : placeholder,
        'for': elementId,
        css:
            {
                position: 'absolute',
                cursor: 'text',
                color: '#a9a9a9',
                fontSize: $element.css('fontSize'),
                fontFamily: $element.css('fontFamily')
            }
    }).insertAfter($element);
    // 绑定事件
    var _setPosition = function () {
        $label.css({ marginTop: GetStringNumValue($element.css('marginTop')) + 8 + 'px', marginLeft: '-' + (GetStringNumValue($element.css('width')) - 6) + 'px' });
    }
    var _resetPlaceholder = function () {
        if ($element.val()) { $label.html(null); }
        else {
            _setPosition();
            $label.html(placeholder);
        }
    }
    _setPosition();
    $element.on('focus blur input keyup propertychange resetplaceholder', _resetPlaceholder);

代码很简单,需注意的是:

1、label 的 margin-top / margin-left,因为我们的项目用了 bootstrap 框架,已设定了输入框的内间距为 "padding: 4px 6px;" 所以这里需缩进对应的像素值。

2、GetStringNumValue() 是我们自己定义的方法,使用正则表达式,用于把字符串中的数字提取,例如 "123px" 返回 123。

3、对于 IE 中不支持的版本,propertychange 真是一个好方法,完美的结合了!...

4、扩展方法 resetplaceholder,用于使用 js 改变输入框值时(赋值、清空),对 placeholder 进行值的对应设置。

效果:

——IE8

js兼容的placeholder属性详解

——IE9

js兼容的placeholder属性详解

Javascript 相关文章推荐
IE和Mozilla的兼容性汇总event
Aug 12 Javascript
javascript 学习之旅 (2)
Feb 05 Javascript
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
Mar 16 Javascript
js不完美解决click和dblclick事件冲突问题
Jul 16 Javascript
javascript读取Xml文件做一个二级联动菜单示例
Mar 17 Javascript
浅析jQuery操作select控件的取值和设值
Dec 07 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
Jul 31 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
Apr 25 Javascript
JavaScript字符串转数字的简单实现方法
Nov 27 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 #Javascript
jquery验证表单中的单选与多选实例
Aug 18 #Javascript
JS+CSS实现一个气泡提示框
Aug 18 #Javascript
JS中for循序中延迟加载动态效果的具体实现
Aug 18 #Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 #Javascript
JS通过相同的name进行表格求和代码
Aug 18 #Javascript
复选框全选与全不选操作实现思路
Aug 18 #Javascript
You might like
PHP脚本的10个技巧(3)
2006/10/09 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
php之可变函数的实例详解
2017/09/13 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
浅析PHP开发规范
2018/02/05 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
励志演讲稿500字
2014/08/21 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
工作检讨书500字
2014/10/19 职场文书
爱的教育读书笔记
2015/06/26 职场文书
入队仪式主持词
2015/07/04 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS