HTML5 は入力ボックスに見栄えの良いドロップダウン リスト、つまりデータリストを定義しています。しかし、現在のサポートは良くありません (クソ IE、幸いにもあなたは徐々に引退するでしょう...)。そこで私は最近、IE8 と互換性のある小さなデータリスト プラグインをオンデマンドに基づいて作成しました (IE7 を使用する人はもう多くありませんよね?)。実装の具体的な要件は次のとおりです:
選択すると (ブラー フォーカスをトリガーすると) (マウスまたはタブ キーのいずれか)、入力ボックスがクリアされ、カスタム ドロップダウン リストが表示され、キーボードの上下キーが使用できるようになります。選択するには (マウスを使用できない理由はありません)、マウスの左ボタンをクリックするか Enter キーを押して、選択したリストの値を入力ボックスに入力します。
具体的な実装コードは次のとおりです。
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 はブラウザのデフォルト値を初期化するために使用されます。ここでは 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);
ここでは、データリスト オプションをシミュレートするために ul li リストが使用されています。実装ロジックは非常に単純です。注意する必要があるのは、ul.input1_ul の相対的な配置を容易にするために div.input_wrap が相対的に配置されていることです。相互に影響を与えない入力ボックスが多数あるため、ここでは input1 を示します。とにかく、これは私が自分で開発した最初のプラグインなので、マークしておきます。
コードが必要な場合は、https://github.com/codetker/myDatalist をクリックします。
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。