实现placeholder效果的方案汇总


Posted in Javascript onJune 11, 2015

placeholder是html5<input>的一个属性,它提供可描述输入字段预期值的提示信息(hint), 该提示会在输入字段为空时显示。高端浏览器支持此属性(ie10/11在获得焦点时文字消失),ie6/7/8/9则不支持。为了兼容各主流浏览器并使其呈现效果保持一致,以下三套方案仅供参考。

方案一:

摒弃原始属性placeholder,为input添加一个兄弟节点span,并为span设置绝对定位(父节点为position: relative;),使其位于input之上。html代码片段如下:

<li>
  <div class="inputMD" style="position: relative;">
    <input class="phInput" type="text" />
    <span class="phText" style="clear: both; height: 33px; line-height: 33px; color: #aaa; position: absolute; left: 10px; top: 5px;">手机号码/邮箱地址</span>
  </div>
</li>
<li>
  <div class="inputMD" style="position: relative;">
    <input class="phInput" type="password" />
    <span class="phText" style="clear: both; height: 33px; line-height: 33px; color: #aaa; position: absolute; left: 10px; top: 5px;">请输入密码</span>
  </div>
</li>

js代码如下(简单写了个函数,没写插件形式,呵呵):

function _placeholderText(phInput, phText) { //定义函数,传递2个参数——input输入框和text提示文本的id或者class
  var $input = $(phInput);
  var $text = $(phText);
  $input.each(function() { //页面加载时遍历所有仿placeholder的input
    var _this = $(this);
    var _text = _this.siblings(phText);
    if($.trim(_this.val()) == '') {
      _this.val("");
      _text.show();
    } else {
      _text.hide();
    }
  });
  $text.on('click', function() { //点击提示信息,input获取焦点
    $(this).siblings(phInput).focus();
  });
  $input.on('input propertychange blur', function() { //为input注册事件,value值改变(其实是属性发生变化)时以及失去焦点时判断value值是否为空
    var _this = $(this);
    if(_this.val() == '') {
      _this.siblings(phText).show();
    } else {
      _this.siblings(phText).hide();
    }
  });
}

_placeholderText('.phInput', '.phText'); //调用函数

个人总结:方案一适用于登录页面,但对于后台form表单及前台的搜索页面不太适合,因为要增加新的提示文本标签,不太友好。

方案二:

同样摒弃原始属性placeholder,为<input>添加一个属性phText="手机号码/邮箱地址"。默认状态下,value值为提示文本并且颜色为灰色;<input>获得焦点时,若value值等于phText属性值,则value值置空;<input>失去焦点时,若value值为空,则value值为提示文本。js代码如下:

function inputJsDIY(obj, colorTip, colorTxt) { //定义函数,传递3个参数——DOM对象、提示文本的颜色值、输入文本的颜色值
  colorTip = colorTip || '#aaaaaa';
  colorTxt = colorTxt || '#666666';
  obj.each(function() {
    var _this = $(this);
    _this.css({"color": colorTip}); //输入框颜色默认置为提示文本的颜色值
    if($.trim(_this.val()) == "") { //判断value值是否为空,若为空则value值赋值等于提示文本
      _this.val(_this.attr("phText"));
    } else if(_this.val() != _this.attr("phText")) {
      _this.css({"color": colorTxt}); //正常的输入文本颜色值
    }
  });
  obj.on("focus", function() { //获取焦点时做判断
    var _this = $(this);
    var value = _this.val();
    if(value == _this.attr("phText")) {
      _this.val("");
    }
    _this.css({"color": colorTxt});
  });
  obj.on("blur", function() { //失去焦点时做判断
    var _this = $(this);
    var value = _this.val();
    if($.trim(value) == "") {
      _this.val($(this).attr("phText")).css({"color": colorTip});
    }
  });
  obj.parents("form").on("submit", function() { //提交表单时去除提示文本(把提示文本置空)
    obj.each(function() {
      var _this = $(this);
      if(_this.val() == _this.attr("phText")) {
        _this.val("");
      }
    });
  });
}

inputJsDIY($('.phInput'), '#aaa', '#666'); //调用函数

个人总结:方案二比较适合后台页面form表单及前台搜索页面,操作简单,无附加标签。缺点是不能用于password类型的<input>,而且<input>获得焦点时的提示文本消失(value值等于phText属性值时),这一点与原始的placeholder属性不同。

另外,也可以把phText属性改为placeholder属性,支持的浏览器呈现原始效果,不支持的浏览器通过js判断{'placeholder' in document.createElement('input')}调用方案二中的函数。此折中方案也有其缺点,各浏览器呈现的效果不完全一样。

方案三:

为不支持placeholder的浏览器写一个方法,首先把placeholder值赋给<input>并且颜色置为灰色,然后<input>获得焦点时判断value值等于placeholder值的话,把光标移至最前面(this.createTextRange和this.setSelectionRange)。当发生输入操作时,先把value值置为空,然后再接收输入值。另外,对于<input type="password">要为其新增一个<input type="text">用来显示提示文本,当发生输入操作时,需要把<input type="text">隐藏,然后把<input type="password">显示出来并让其获得焦点。此方案也有一些小缺陷,那就是当用鼠标右键粘贴时会出现bug。

总体上来讲,几种方案各有优缺点。登录页面我更倾向于使用方案一,呈现效果完全一致,仅仅是增加个新标签也不算麻烦。后台form表单和前台搜索页面更倾向于方案二,简单有效,只是在获得焦点时提示文本消失。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
jQuery渐变发光导航菜单的实例代码
Mar 27 Javascript
浅谈javascript 函数内部属性
Jan 21 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
浅谈JavaScript for循环 闭包
Jun 22 Javascript
JQuery DIV 动态隐藏和显示的方法
Jun 23 Javascript
Vue.js 利用v-for中的index值实现隔行变色
Aug 01 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
微信小程序嵌入腾讯视频源过程详解
Aug 08 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
浅谈vue中使用编辑器vue-quill-editor踩过的坑
Aug 03 Javascript
vue treeselect获取当前选中项的label实例
Aug 31 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 #Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 #Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 #Javascript
javascript 常见功能汇总
Jun 11 #Javascript
简介JavaScript中的setHours()方法的使用
Jun 11 #Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 #Javascript
JQuery遍历DOM节点的方法
Jun 11 #Javascript
You might like
php4的session功能评述(一)
2006/10/09 PHP
获取URL文件名后缀
2013/10/24 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
Maps Javascript
2007/01/22 Javascript
lib.utf.js
2007/08/21 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
数控加工专业毕业生自荐信
2013/09/27 职场文书
如何写你的创业计划书
2014/01/07 职场文书
同学聚会老师邀请函
2014/01/28 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
房屋产权证明书
2014/10/15 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
浅谈python数据类型及其操作
2021/05/25 Python
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers