HTML5 définit une jolie liste déroulante dans la zone de saisie - datalist Cependant, son support actuel n'est pas bon (Merde IE, heureusement vous prendrez votre retraite progressivement...). J'ai donc récemment écrit un petit plug-in de liste de données basé sur la demande, qui est compatible avec IE8 (plus beaucoup de gens n'utilisent plus IE7, n'est-ce pas ?). Les exigences spécifiques pour la mise en œuvre sont les suivantes :
Lorsqu'elle est sélectionnée (déclenchant le flou) (qu'il s'agisse de la souris ou de la touche de tabulation), la zone de saisie est effacée et une liste déroulante personnalisée s'affiche, puis les touches haut et bas du clavier peuvent être utilisées pour sélectionner (il n'y a aucune raison pour que la souris ne puisse pas être utilisée), cliquez sur le bouton gauche de la souris ou sur la touche Entrée pour saisir la valeur de la liste sélectionnée dans la zone de saisie.
Le code d'implémentation spécifique est le suivant :
HTML
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <meta name="robots" content="index, follow" /> <meta name="googlebot" content="index, follow" /> <meta name="author" content="codetker" /> <title> 表单选中弹出框</title> <link href="css/reset.css" type="text/css" rel="Stylesheet" /> <link href="css/master.css" type="text/css" rel="Stylesheet" /> <script type="text/javascript" src="js/jquery-1.11.0.js"></script> </head> <body> <div class="wrap"> <form class="center"> <div class="input_wrap"> <input name="input1" class="input input1" type="text"/> <ul class="input1_ul select_list"> <li>问题1</li> <li>问题2</li> <li>问题3</li> <li>问题4</li> <li>问题5</li> </ul> </div> </form> </div> <script type="text/javascript" src="js/jquery.codetker.datalist.js"></script> <script type="text/javascript"> $(document).ready(function(){ $(".input_wrap").myDatalist({"bgcolor":"red","widths":1,"heights":1}); }); </script> </body> </html>
CSS (reset.css est utilisé pour initialiser les valeurs par défaut du navigateur, voici style.css)
.wrap{ margin:0 auto; font-family: "微软雅黑";font-size: 14px;} .center{ margin: 0 auto; width:500px;} .input{ margin: 0; padding: 0; /*border:none;*/ width:140px; height: 24px; float:left;} .select_list{display: none; position:absolute; z-index: 100;} .select_list li{ height:24px; margin: 0; padding: 0; background-color: #fff; cursor: pointer; list-style: none; position:relative;} .select_list li:hover{ background-color: red;} .input_wrap{ position:relative; }
JavaScript
/* datalist 0.1 自定义datalist插件,实现html5中input元素datalist的效果 兼容IE8+,Firefox,Chrome等常见浏览器 */ ;(function($,window,document,undefined){ //undefinde是真实的undefined,并非参数 //将可选择的变量传递给方法 //定义构造函数 var Datalist=function(ele,opt){ this.$element=ele; this.defaults={ 'bgcolor':'green', 'widths':1, 'heights':1 }, this.options=$.extend({}, this.defaults, opt); } //定义方法 Datalist.prototype={ showList:function(){ var color=this.options.bgcolor; var width=this.options.widths; var height=this.options.heights; //属性值 var obj=this.$element; //obj为最外层包裹的div之类的元素,应该拥有positive:relative属性,方便datalist定位。 var input=$(obj).children().eq(0); //input元素 var inputUl=$(obj).children().eq(1); //datalist元素 //设置弹出datalist的大小和样式 $(inputUl).css({ "top":$(input).outerHeight()+"px", "width":$(input).outerWidth()*width+"px" }); $(inputUl).children().css({ "width":$(input).outerWidth()*width+"px", "height":$(input).outerHeight()*height+"px" }); $(inputUl).children('li').mouseover(function() { $(this).css("background-color",color); $(this).siblings().css("background-color","#fff"); }); $(inputUl).children('li').mouseout(function() { $(this).css("background-color","#fff"); }); //再次focus变为空,也可以改为某个默认值 //datalist的显示和隐藏 $(input).focus(function() { if($(this).val()!=""){ $(this).val(""); } $(inputUl).slideDown(500); var n=-1; //记录位置,-1表示未选中。当n=-1时直接按enter浏览器默认为倒数第一个 $(document).keydown(function(event) { /* 点击键盘上下键,datalist变化 */ stopDefaultAndBubble(event); if(event.keyCode==38){//向上按钮 if(n==0||n==-1){ n=4; }else{ n--; } $(inputUl).children('li').eq(n).siblings().mouseout(); $(inputUl).children('li').eq(n).mouseover(); }else if(event.keyCode==40){//向上按钮 if(n==4){ n=0; }else{ n++; } $(inputUl).children('li').eq(n).siblings().mouseout(); $(inputUl).children('li').eq(n).mouseover(); }else if(event.keyCode==13){//enter键 $(inputUl).children('li').eq(n).mouseout(); $(input).val( $(inputUl).children('li').eq(n).text() ); n=-1; } }); //去掉浏览器默认 function stopDefaultAndBubble(e){ e=e||window.event; //阻止默认行为 if (e.preventDefault) { e.preventDefault(); } e.returnValue=false; //阻止冒泡 if (e.stopPropagation) { e.stopPropagation(); } e.cancelBubble=true; } }); $(input).blur(function() { $(inputUl).slideUp(500); }); $(inputUl).delegate('li', 'click', function() { $(input).val( $(this).text() ); }); return this; } } //在插件中使用Datalist对象 $.fn.myDatalist=function(options){ //创建实体 var datalist=new Datalist(this,options); //调用其方法 return datalist.showList(); } })(jQuery,window,document);
Ici, la liste ul li est utilisée pour simuler les options de la liste de données. La logique d'implémentation est très simple. Ce qu'il faut noter, c'est que div.input_wrap est positionné relativement pour faciliter le positionnement relatif de ul.input1_ul. Puisqu'il existe de nombreuses zones de saisie qui ne s'influencent pas les unes les autres, voici input1. Quoi qu'il en soit, c'est le premier plug-in que j'ai développé moi-même, donc je vais le noter.
Si vous avez besoin du code, vous pouvez cliquer sur https://github.com/codetker/myDatalist.
Ce qui précède représente l’intégralité du contenu de cet article, j’espère que vous l’aimerez tous.