jQueryプラグイン開発のdatalist
24518 ワード
HTML 5ではinputボックスがきれいなドロップダウンリストであるdatalistが定義されていますが、現在のサポートはよくありません(万悪のIE、幸いにもあなたはだんだん引退します...).そこで最近さらに需要に応じて小型datalistプラグインを書いて、IE 8に互換性があります(IE 7はあまり使われていないのではないでしょうか?)具体的なニーズは次のとおりです.
選択されている場合(blurフォーカスをトリガー)(マウスでもtabキーでも)inputボックスを空にしてカスタムのドロップダウンリストを表示し、キーボードの上下キーで選択できます(マウスはもちろんできない理由はありません)、マウスの左ボタンまたはenterキーをクリックして選択したリストの値をinputボックスに入力します.
具体的な実装コードは以下の通りです.
HTML
CSS(reset.cssではブラウザのデフォルト値を初期化するために使用され、ここではstyle.css)
JavaScript
ここではulliリストを用いてdatalist optionsをシミュレートする.実装ロジックは非常に簡単で、少し注意しなければならないのはdiv.input_です.wrapは相対的に位置決めされており、便利です.input1_ulは相対的に位置決めされる.需要は多くの入力ボックスがあり、互いに影響しないため、ここではinput 1である.どうやら私が自分で開発した最初のプラグインで、markは覚えています.
コードが必要なスタンプhttps://github.com/codetker/myDatalist.
選択されている場合(blurフォーカスをトリガー)(マウスでもtabキーでも)inputボックスを空にしてカスタムのドロップダウンリストを表示し、キーボードの上下キーで選択できます(マウスはもちろんできない理由はありません)、マウスの左ボタンまたはenterキーをクリックして選択したリストの値をinputボックスに入力します.
具体的な実装コードは以下の通りです.
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);
ここではulliリストを用いてdatalist optionsをシミュレートする.実装ロジックは非常に簡単で、少し注意しなければならないのはdiv.input_です.wrapは相対的に位置決めされており、便利です.input1_ulは相対的に位置決めされる.需要は多くの入力ボックスがあり、互いに影響しないため、ここではinput 1である.どうやら私が自分で開発した最初のプラグインで、markは覚えています.
コードが必要なスタンプhttps://github.com/codetker/myDatalist.