艺灵设计

全部文章
×

让ie6到ie9完美兼容placeholder属性的jquery.yilingsj-placeholder.js插件

作者:艺灵设计 - 来源:http://www.yilingsj.com - 发布时间:2015-03-04 20:01:19 - 阅: - 评:0 - 积分:0

昨天技术终于把公司网站的权限给我了,然后我就需要对网站中的css和页面代码进行大量的优化了,到目前为止还没有开工。我到底在忙什么呢?当然是制作插件了,目前插件已经制成,现来分享一下。

什么插件呢?这个得从公司说起了。由于公司页面是之前一位制作写的代码,插件都是网上找的并且功能并不是很好。现在是我接手这个岗位,平日里有需求时也要往页面中增删内容,因此,精简及优化是势在必行的。这个插件与输入框有关,也许你已经猜到了。是的,就是placeholder

至于这个placeholder是干什么的呢,简单来说就是:文本占位符。也许你会想到一个更小常用的--value,的确如此。那么二者的区别又是什么呢?简单来说就是:前者兼容ie9+,默认不传值并且在文本框不为空时才自动清除;后者是默认传值文本框获取焦点时就清除。具体详细解释请自行网上资料吧。

于是某人搜索一翻,结果发现网上相关的插件也是很多。那么今天艺灵分享的这款与其它的有什么不同呢?答案肯定是有的。所谓:条条大路通罗马嘛。网上的答案无外乎两种。
方案一:传值给vlaue,即ie9-时通过jquery来将placeholder的值传递给value;
方案二:创建新标签,即ie9-时用jquery来创建标签,通过定位来覆盖到原文本框上面。而我是一个完美主义者,当然是尽可能的还原placeholder效果了。

在还原效果之前先来说下自己写这款也是第一款插件中学到的一个新知识点吧,那就是判断浏览器

往常我们会使用jquery中的$.browser方法来检测浏览器或者是直接使用ie注释<--[if lte IE 6]><![endif]-->,这次,我们换种方法return 'placeholder' in document.createElement('input');这个就可以了。严格来说,这个是判断浏览是否支持placeholder属性的。网上有此类案例的应用,如检测浏览器是否支持css3中的属性。虽然我对此写法不是很懂,但通过对比后得出一个公式:return 'A' in document.createElement('B'),意思就是:检测浏览器中的B标签是否支持A属性,经测试是屡试不爽(嗞牙)这里更正一下,后在群内小伙伴的帮助下找到了相关资料,原来这个是in 运算符

用这个方法判断浏览器,代码省了不少而且个人感觉比其它方法要更好。接下来就是该如何写代码了,说了这么多,大家连个图都没有看到。来放一张最后的效果图然后再放代码吧,如图:
ie6+完美兼容placeholder属性的效果图

这个是兼容ie6+的,密码框也是做了兼容性处理,文本框在有内容时提示文字才会以过渡的方式消失,效果跟placeholder一样,只是多了一个过渡而已(嗞牙)。下面我们来看看这款插件的源码吧。

jquery.yilingsj-placeholder.js

  1. /* Name:jquery.yilingsj-placeholder.js
  2. * compatible:ie6+
  3. * Version:0.1
  4. * Author:艺灵设计
  5. * Date:2015-03-04
  6. * describing:ie6到ie9中的文本/密码框均支持placeholder属性
  7. * Email:315800015@qq.com
  8. * Demo:http://www.yilingsj.com/d/file/jquery/2015-03-04/jquery.yilingsj-placeholder-demo.html
  9. */
  10. /*
  11. * //插件调用 (ps:圆角/阴影等css3属性请自行使用PIE.htc插件来兼容ie9-)
  12. $.fn.placeholder({
  13. placetext:"yilingsj-placeholdertext", //显示文本的class名
  14. placelder:"yilingsj-placeholder", //文本父级的class名
  15. Event:"click", //触发方式,保持默认即可。预留可选值:1.click:文本不为空清空默认内容;
  16. changeTime:100, //文本消失/隐藏时间,单位是:ms,1s=1000ms
  17. makeCss:1, //自动生成css的控制开关,可选值:[0,1],0:不生成;1:生成。 主要考虑到使用插件的小盆友不一定会自己写css,特在此提供一个入口,选择1后页面中会自动生成css,小盆友可以拿生成的与自己的对比下哦^o^! 下面是调用插件时文本框的一些基本属性设置供修改,不会修改css的小盆友自行看手册解决,切勿填错属性,否则生成的css会有误
  18. width:"410px", //输入框宽
  19. height:"35px", //输入框高
  20. borderWidth:"1px", //边框宽
  21. borderStyle:"solid", //边框样式
  22. borderColor:"#999", //边框颜色
  23. borderRadius:"5px", //圆角
  24. boxShadow:"1px 2px 3px #ccc", //阴影
  25. activeBorder:"1px solid #E7BF5B", //输入框点击(获焦)时边框颜色
  26. activeboxShadow:"1px 1px 3px #E7BF5B", //输入框点击(获焦)时阴影
  27. fontFamily:"微软雅黑", //字体
  28. fontSize:"12px", //字体大小
  29. fontStyle:"normal", //字体样式
  30. textIndent:"3px", //文本缩进
  31. color:"#999" //文本颜色
  32. });
  33. */
  34. ;(function($){
  35. $.fn.placeholder=function(options){/*扩展函数placeholder*/
  36. var defaults={
  37. placetext:"yilingsj-placeholdertext",/*显示文本的class名*/
  38. placelder:"yilingsj-placeholder", /*文本父级的class名*/
  39. Event:"click", /*触发方式,保持默认即可。预留可选值:1.click:文本不为空清空默认内容;2.mouseover:获取焦点时清空默认内容 ; 待完善*/
  40. changeTime:100, /*文本消失/隐藏时间,单位是:ms,1s=1000ms*/
  41. makeCss:1, /*自动生成css开关,可选值:[0,1],0:不生成;1:生成。 主要考虑到使用插件的小盆友不一定会自己写css,特在此提供一个入口,选择1后页面中会自动生成css,小盆友可以拿生成的与自己的对比下哦^o^! 下面是调用插件时文本框的一些基本属性设置供修改,不会修改css的小盆友自行看手册解决,切勿填错属性,否则生成的css会有误*/
  42. width:"410px", /*输入框宽*/
  43. height:"35px", /*输入框高*/
  44. borderWidth:"1px", /*边框宽*/
  45. borderStyle:"solid", /*边框样式*/
  46. borderColor:"#999", /*边框颜色*/
  47. borderRadius:"5px", /*圆角*/
  48. boxShadow:"1px 2px 3px #ccc", /*阴影*/
  49. activeBorder:"1px solid #E7BF5B", /*输入框点击(获焦)时边框颜色*/
  50. activeboxShadow:"1px 1px 3px #E7BF5B", /*输入框点击(获焦)时阴影*/
  51. fontFamily:"微软雅黑", /*字体*/
  52. fontSize:"12px", /*字体大小*/
  53. fontStyle:"normal", /*字体样式*/
  54. textIndent:"3px", /*文本缩进*/
  55. color:"#999" /*文本颜色*/
  56. };
  57. var options=$.extend(defaults,options);/*传参并覆盖defaults*/
  58. if(!placeholderSupport()){ // 低版本ie时调用
  59. var $place=$('[placeholder]');
  60. var placelder=options.placelder; /*创建一个span便于定位*/
  61. var placetext=options.placetext; /*显示文本*/
  62. var p_text='.'+placetext;
  63. var p_place='.'+placelder;
  64. var $placetext=$(p_text);
  65. $place.wrap('<span class="'+placelder+'"></span>').after('<em class="'+placetext+'"></em>');
  66. /*遍历span的内容为同辈的placeholder默认值*/
  67. $place.each(function(){
  68. $(this).siblings(p_text).css({"height":options.height,"line-height":options.height}).text($(this).attr("placeholder"));
  69. });
  70. /*鼠标放到span时input获取焦点*/
  71. $(p_place).delegate(p_text,options.Event,function(){
  72. $(this).siblings('input').focus().addClass('hover').end().parents(p_place).addClass('hover');
  73. });
  74. /*input操作*/
  75. $place.keydown(function(){/*键盘被按下时span隐藏*/
  76. $(this).siblings(p_text).fadeOut(options.changeTime);
  77. }).blur(function(){ /*失焦时span显示*/
  78. if($(this).val()==""){$(this).siblings(p_text).fadeIn(options.changeTime).end().removeClass('hover').end().parents(p_place).removeClass('hover');}
  79. });
  80. /*生成css调用判断*/
  81. if(makeCss="1"){
  82. /*自动生成css并以内部样式表的形式插入页面中,(ps:可提取出来复制到公用样式表中)*/
  83. make_css();
  84. };
  85. };
  86. /*自动生成css并以内部样式表的形式插入页面中,方便后面调用*/
  87. function make_css(){
  88. $('body').append('<!--jquery.yilingsj-placeholder.js自动生成css,可提取出来粘贴进公用样式表中--><style>'+p_place+"{position:relative;z-index:1;display:inline-block;border-radius:"+options.borderRadius+";box-shadow:"+options.boxShadow+";font-family:"+options.fontFamily+";font-size:"+options.fontSize+";font-style:"+options.fontStyle+";color:"+options.color+'}'+p_text+"{position:absolute;left:0;top:"+options.borderWidth+";z-index:99;display:inline-block;width:"+options.width+";height:"+options.height+";line-height:"+options.height+";font-family:"+options.fontFamily+";font-size:"+options.fontSize+";font-style:"+options.fontStyle+";text-indent:"+options.textIndent+";color:"+options.color+';cursor:text;background:url(about:blank);}'+p_place+" input{*float:left;/*兼容ie7-下的top?:1px;*/display:inline-block;margin:0;padding:0;width:"+options.width+";height:"+options.height+";line-height:"+options.height+";border-width:"+options.borderWidth+";border-color:"+options.borderColor+";border-style:"+options.borderStyle+";font-family:"+options.fontFamily+";font-size:"+options.fontSize+";font-style:"+options.fontStyle+";text-indent:"+options.textIndent+";color:"+options.color+';outline:0;}'+p_place+" input.hover{border:"+options.activeBorder+';-webkit-transition: .5s;transition: .5s;}'+p_place+".hover{box-shadow:"+options.activeboxShadow+';-webkit-transition: .5s;transition: .5s;}</style>');
  89. };
  90. /*定义函数*/
  91. function placeholderSupport() {
  92. return 'placeholder' in document.createElement('input');// 判断浏览器是否支持 placeholder
  93. };
  94. return this;
  95. };
  96. })(jQuery);

上面源码中带有注释,有兴趣的可以研究下。当然了,做为艺灵写的第一款插件,不足之处还是有的,也希望读者可以提出意见或者自己的思路等。下面再来说下如何调用吧,跟其它插件一样,调用还是比较简单的。

默认参数:

  1. $.fn.placeholder();//duang~就是这么简单,duang~的一下就出来了

当然了,上面那个调用的是默认参数的效果,如果想修改参数也是可以的,毕竟总是有一些特殊需求的人嘛!代码如下。

修改参数:

  1. $(function(){
  2.  $.fn.placeholder({//调用插件
  3.  placelder:"yilingsj-placeholder", //文本父级的class名
  4.  placetext:"yilingsj-placeholdertext",//显示文本的class名
  5.  Event:"click",     //触发方式,保持默认即可。预留可选值:1.click:文本不为空清空默认内容;
  6.  changeTime:100, //文本消失/隐藏时间,单位是:ms,1s=1000ms
  7.  makeCss:1, //自动生成css的控制开关,可选值:[0,1],0:不生成;1:生成。 主要考虑到使用插件的小盆友不一定会自己写css,特在此提供一个入口,选择1后页面中会自动生成内部css样式表,小盆友可以拿生成的与自己的对比下哦^o^! 下面是调用插件时文本框的一些基本属性设置供修改,不会修改css的小盆友自行看手册解决,切勿填错属性,否则生成的css会有误
  8.  width:"410px", //输入框宽
  9.  height:"35px", //输入框高
  10.  borderWidth:"1px", //边框宽
  11.  borderStyle:"solid", //边框样式
  12.  borderColor:"#999", //边框颜色
  13.  borderRadius:"5px", //圆角
  14.  boxShadow:"1px 2px 3px #ccc", //阴影
  15.  activeBorder:"1px solid #E7BF5B", //输入框点击(获焦)时边框颜色
  16.  activeboxShadow:"1px 1px 3px #E7BF5B", //输入框点击(获焦)时阴影
  17.  fontFamily:"微软雅黑", //字体
  18.  fontSize:"12px", //字体大小
  19.  fontStyle:"normal", //字体样式
  20.  textIndent:"3px", //文本缩进
  21.  color:"#999" //文本颜色
  22.  });
  23. });

duang~怎么可以这么多!!!莫慌莫慌,先来仔细看看吧。你有什么发现?duang~竟然可以给小白自动生成css,真是太友好了!是的,当makeCss的值为1时就可以通过设置后面的参数来自动生成css,这个主要是给小白提供方便的。如果你写有自己的css,那这里就可以修改成0了。其实,最主要的是黄色高亮部分。这里才是关键,这里是jquery新建的样式名,注意修改时前面不要添加.如果要修改的话一定要保持你写的css和这个一致哦!

图也上了,代码也上了,可就是没有效果页面。莫急,这就上完整的源码。

jquery.yilingsj-placeholder-demo.html v:0.1

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>让ie6到ie9完美兼容placeholder属性的jquery.yilingsj-placeholder.js插件--艺灵设计,qq群:231749938</title>
  6. <meta name="author" content="艺灵设计,315800015@qq.com,yilingsj@gmail.com, www.yilingsj.com">
  7. <meta name="keywords" content="ie6兼容placeholder属性,跨浏览器兼容placeholder属性,jquery.yilingsj-placeholder.js插件">
  8. <style type="text/css">
  9. *{margin: 0;padding: 0;}
  10. body{font-family:微软雅黑; font-size: 14px;}
  11. ul,ol{list-style: none;}
  12. .cf00{color: #f00;}
  13. /*以上为页面简单重构,无需复制*/
  14. /*简单登录演示框*/
  15. .ylsj-loginw{width:500px ; margin: 100px auto;padding:10px;border:1px solid #ccc; border-radius:5px;box-shadow: 1px 2px 3px #ccc;}
  16. .ylsj-loginw h1{font-size: 16px;margin:0 auto 10px;}
  17. .ylsj-loginw ul li{margin-bottom: 10px;%;height:37px;line-height:37px;}
  18. .ylsj-loginw ul li label{display:inline-block;width:50px;height:35px;line-height:35px;vertical-align:top;}
  19. /*登录框内文本框默认样式*/
  20. input[type="text"],input[type="password"]{width: 410px;height:35px;line-height:35px;border-radius:5px;margin:0;padding:0;border:1px solid #666;vertical-align:top;outline:0;color: #999;text-indent: 3px;}
  21. input[type="text"]:focus,input[type="password"]:focus{border:1px solid #E7BF5B;-webkit-transition: .5s;transition: .5s;}
  22. </style>
  23. <!--引入jquery库-->
  24. <script src="/skin/yilingsj/js/jquery-1.8.3.min.js" type="text/javascript" charset="utf-8"></script>
  25. <!--引入jquery.yilingsj-placeholder.js插件 v:0.1-->
  26. <script src="/d/file/jquery/2015-03-04/jquery.yilingsj-placeholder.js" type="text/javascript" charset="utf-8"></script>
  27. </head>
  28. <body>
  29. <script type="text/javascript">
  30. $(function(){
  31. /*插件调用*/
  32. $('.ylsj-loginw input').placeholder({});
  33. });
  34. </script>
  35. <div class="ylsj-loginw">
  36. <h1>文本/密码框都支持placeholder的哦!duang~就连<span class="cf00">ie6</span>也妥妥滴!</h1>
  37. <form action="" method="post">
  38. <ul>
  39. <li><label for="username">帐号:</label><input type="text" name="username" id="username" placeholder="duang~请输入您的帐号" /></li>
  40. <li><label for="password">密码:</label><input type="password" name="password" id="password" placeholder="duang~请输入您的密码" /></li>
  41. <li><label for="other">打杂:</label><input type="text" name="other" id="other" value="duang~我是打杂的,不设置placeholder的话duang~就不关我的事了" /></li>
  42. </ul>
  43. </form>
  44. <!--jquery.yilingsj-placeholder.js 版本:0.1-->
  45. <h2 style="text-align: right;font-size: 12px;padding-right: 8%;">Version:0.1</h2>
  46. </div>
  47. </body>
  48. </html>

Demo/源码下载:

  1. Demo演示页面jquery.yilingsj-placeholder.js插件 v:0.1 (内含案例源码)

好了,今天就到这里。明天该开始改版公司页面了。

2015.4.18号更新

后来在使用过程中发现上面的第一版不是多理想。如图:
input前有ico小图标
这种情况时需要添加小图标,那势必还是需要提前给input添加一个父级样式,这个样式内再添加一个小图标的标签。于是,我又对上面的代码进行了修改,第二版就出炉了。

刚才说过,要提前给input添加父级样式,也就是说在写页面html代码的时候就要添加好,所以我们需要先写出css样式。

css

  1. /*简单登录演示框*/
  2. .ylsj-loginw{width:500px ; margin: 100px auto;padding:10px;border:1px solid #ccc; border-radius:5px;box-shadow: 1px 2px 3px #ccc;}
  3. .ylsj-loginw h1{font-size: 16px;margin:0 auto 10px;}
  4. .ylsj-loginw ul li{margin-bottom: 10px;%;height:37px;line-height:37px;}
  5. .ylsj-loginw ul li label{display:inline-block;width:50px;height:35px;line-height:35px;vertical-align:top;}
  6. /*input默认样式设置*/
  7. .yilingsj-placeholder{position:relative;z-index:1;display:inline-block;width:100%;border-radius:5px;box-shadow:1px 2px 3px #ccc;font-family:微软雅黑;font-size:12px;font-style:normal;color:#999}
  8. .yilingsj-placeholder input,input[type="text"]{*float:left;/*兼容ie7-下的top?:1px;*/display:inline-block;margin:0;padding:0;width:100%;height:35px;line-height:35px;border:1px solid #999 ;font-size:12px;font-style:normal;text-indent:30px;color:#999;outline:0;font-family:微软雅黑;}
  9. .yilingsj-placeholder input:focus,.yilingsj-placeholder input.on{border:1px solid #E7BF5B;-webkit-transition: .5s;transition: .5s;}
  10. /*ico图标*/
  11. .login_ico{position: absolute;left:10px;top:9px;background: url(/d/file/jquery/2015-03-04/login_ico.png) no-repeat;background-color: #ccc;display: inline-block;width:16px;height:19px;-webkit-transition: .5s;transition: .5s;}
  12. .login_ico.name{background-position: -40px 0px;}
  13. .login_ico.pass{background-position: -40px -19px;}
  14. /*滑过触发ico图标变色*/
  15. .yilingsj-placeholder input:focus ~ .login_ico,.yilingsj-placeholder.on .login_ico{background-color:#34a3eb;}
  16. /*ie placeholder*/
  17. .yilingsj-placeholder .placeholdertext{position:absolute;left:0;top:0;z-index:99;width:100%;color:#666;font-style:normal;font-size:12px;background:url(about:blank)\9;cursor:text; text-indent: 30px;}

然后我们在html中调用插件即可。

html

  1. <div class="ylsj-loginw">
  2. <h1>文本/密码框都支持placeholder的哦!duang~就连<span class="cf00">ie6</span>也妥妥滴!</h1>
  3. <form action="" method="post">
  4. <ul>
  5. <li class="yilingsj-placeholder"><input type="text" id="top_login_name" name="userName" class="du_login_input" placeholder="手机/邮箱/用户名"><i class="login_ico name"></i></li>
  6. <li class="yilingsj-placeholder"><input type="password" name="password" id="password" placeholder="duang~请输入您的密码" /><i class="login_ico pass"></i></li>
  7. <li><input type="text" name="other" id="other" value="duang~我是打杂的,不设置placeholder和父级的话duang~就不关我的事了" /></li>
  8. </ul>
  9. </form>
  10. <!--jquery.yilingsj-placeholder.0.2.js 版本:0.2-->
  11. <h2 style="text-align: right;font-size: 12px;padding-right: 8%;">Version:0.2</h2>
  12. <script type="text/javascript">
  13. $(function(){
  14. $('.yilingsj-placeholder').placeholder();
  15. });
  16. </script>
  17. </div>

Demo/源码下载:

  1. Demo演示页面jquery.yilingsj-placeholder.js插件 v:0.2 (内含案例源码)
转载声明:
  若亲想转载本文到其它平台,请务必保留本文出处!
本文链接:http://www.yilingsj.com/jquery/2015-03-04/250.html

若亲不想直保留地址,含蓄保留也行。艺灵不想再看到有人拿我的技术文章到他的地盘或者是其它平台做教(装)程(B)而不留下我的痕迹。文章你可以随便转载,随便修改,但请尊重艺灵的劳动成果!谢谢理解。

亲,扫个码支持一下艺灵呗~
如果您觉得本文的内容对您有所帮助,您可以用支付宝打赏下艺灵哦!

Tag: ie6兼容placeholder属性 跨浏览器兼容placeholder属性 jquery.yilingsj-placeholder.js插件

上一篇: jquery特效之手风琴式导航   下一篇: jquery表单美化之input实例篇

相关文章

评论区