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 相关文章推荐
Javascript Global对象
Aug 13 Javascript
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
jquery入门—选择器实现隔行变色实例代码
Jan 04 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
jQuery zTree树插件简单使用教程
Jan 10 Javascript
angular仿支付宝密码框输入效果
Mar 25 Javascript
js+html5实现复制文字按钮
Jul 15 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
vue-resource + json-server模拟数据的方法
Nov 02 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
JS中实现一个下载进度条及播放进度条的代码
Jun 10 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
基于mysql的bbs设计(一)
2006/10/09 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
php中smarty区域循环的方法
2015/06/11 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
python破解zip加密文件的方法
2018/05/31 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
迪拜航空官方网站:flydubai
2017/04/20 全球购物
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
一套Delphi的笔试题一
2016/02/14 面试题
计算机系毕业生推荐信
2013/11/06 职场文书
会计专业应届生求职信
2013/11/24 职场文书
高中校园广播稿
2014/01/11 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
学生病假条怎么写
2015/08/17 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP