实现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 相关文章推荐
AngularJS基础 ng-paste 指令简单示例
Aug 02 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
Aug 05 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
Sep 10 Javascript
vue生命周期和react生命周期对比【推荐】
Sep 19 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
9102年webpack4搭建vue项目的方法步骤
Feb 20 Javascript
解决layer图标icon不加载的问题
Sep 04 Javascript
JS回调函数简单易懂的入门实例分析
Sep 29 Javascript
javascript刷新父页面方法汇总详解
Oct 10 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
Oct 24 Javascript
微信小程序后端(java)开发流程的详细步骤
Nov 13 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
js使用formData实现批量上传
2020/03/27 Javascript
vue实现微信分享功能
2018/11/28 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
python client使用http post 到server端的代码
2013/02/10 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
python实现统计代码行数的小工具
2019/09/19 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
质量提升方案
2014/06/16 职场文书
英语通知范文
2015/04/22 职场文书
通过Python把学姐照片做成拼图游戏
2022/02/15 Python