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 相关文章推荐
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
Jan 13 Javascript
jquery 插件学习(一)
Aug 06 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
Apr 02 Javascript
5种处理js跨域问题方法汇总
Dec 04 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
Aug 31 Javascript
jquery获取css的color值返回RGB的方法
Dec 18 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
Dec 17 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
Jun 23 jQuery
使用 vue.js 构建大型单页应用
Feb 10 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 Javascript
vue3 源码解读之 time slicing的使用方法
Oct 31 Javascript
javascript中可能用得到的全部的排序算法
Mar 05 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 xml文件操作代码(一)
2009/03/20 PHP
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python 自定义装饰器实例详解
2019/07/20 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
经济信息管理专业大学生求职信
2013/09/27 职场文书
高中的职业生涯规划书
2013/12/28 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
网吧员工管理制度
2015/08/05 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书