模仿下拉框datalist的jquery插件的一点小经验
原本项目里是用h5的新属性data-list,但是这个下拉框的数据太多,而data-list似乎没有设置高度的地方,所以写了个小插件,期间也发现了一些bug,目前这个版本算是可以一用的版本,故写一下这个插件碰到的奇怪问题。
一点简单的CSS(因为项目原因,暂时只写了webkit内核)。
.datalist_ul {
background: #fff;
display: none;
list-style: none;
padding: 0;
margin: 0;
overflow: auto;
position: absolute;
}
.datalist_ul .datalist_li {
background: transparent;
color: #000;
padding: 0.5em 0.5em;
text-align: left;
font-size: 1.2em;
border-bottom: 0.1em dashed cornflowerblue;
box-sizing: border-box;
}
.datalist_ul .datalist_li_hover {
background: rgba(100, 149, 237,0.8);
color: #fff;
}
.detalist_ul .datalist_li_hide {
display: none;
}
body {
margin: 0;
padding: 0;
}
input {
height: 2em;
padding:0 0.5em;
box-sizing: border-box;
width:180px;
}
::-webkit-scrollbar {
width: 0.5em;
}
/*
::-webkit-scrollbar-button{
height:0.5em;
width:0.5em;
background:#ccc;
}*/
::-webkit-scrollbar:horizontal {
height: 0.2em;
}
::-webkit-scrollbar-track {
-webkit-border-radius: 10px;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
-webkit-border-radius: 10px;
border-radius: 10px;
background: rgba(255, 0, 0, 0.6);
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
}
::-webkit-scrollbar-thumb:window-inactive {
background: rgba(169, 169, 169, 0.4);
}
js代码
(function ($) {
$.fn.extend({
datalist: function (options, func) {
var ul, cur, count = 0, css, hover, visible, scroll;
$(".datalist_li").hover(
function () {
$(".datalist_li").removeClass("datalist_li_hover");
$(this).addClass("datalist_li_hover");
count = $(this).index();
}, function () {
$(this).removeClass("datalist_li_hover");
}
);
$("[data-list]").on({
"click focus": function () {
cur = $(this);
ul = $("[data-list-id='" + cur.attr("id") + "']").eq(0);
console.log(ul);
if (!!ul) {
css = {
"top": cur.css("height"),
"left": cur.position().left + "px",
"display": "block",
"width": cur.css("width")
};
!!options && (css = $.extend(css, options));
//ul.show().css(css);
for (var i in css) {
ul[0].style[i] = css[i];
}
}
},
"keyup": function (e) {
ul.show();
hover = ul.find(".datalist_li_hover");
visible = ul.find(".datalist_li:visible");
switch (e.keyCode) {
case 13:
if (hover.length > 0) {
cur.val(hover.text());
ul.hide().find(".datalist_li").removeClass("datalist_li_hover");
}
!!func && func();
break;
case 38:
if (hover.index() == 0) {
count = visible.length;
}
if (hover.length > 0) {
count--;
visible.removeClass("datalist_li_hover");
visible.eq(count).addClass("datalist_li_hover");
} else {
count = visible.length - 1;
visible.eq(count).addClass("datalist_li_hover");
}
break;
case 40:
if (count == visible.length - 1) {
count = -1;
}
if (hover.length > 0) {
count++;
visible.removeClass("datalist_li_hover");
visible.eq(count).addClass("datalist_li_hover");
} else {
count = 0;
visible.eq(0).addClass("datalist_li_hover");
}
break;
default:
ul.find(".datalist_li").hide().removeClass("datalist_li_hover").each(function () {
if ($(this).text().indexOf(cur.val()) >= 0 || $(this).text() == cur.val()) {
$(this).show();
}
});
}
},
"blur": function () {
hover = ul.find(".datalist_li_hover");
if (hover.length != 0) {
cur.val(hover.text());
cur.attr("value", hover.text());
ul.find(".datalist_li").each(function () {
$(this).removeClass("datalist_li_hover");
});
ul.hide();
count = 0;
!!func && func(hover);
} else {
ul.hide();
}
}
});
}
})
})(jQuery);
总体来说代码难度不大,碰到最奇怪的问题就是 //ul.show().css(css);这一行被注释的代码,原本也是用这一行代码的,但是在项目里碰到这样一个问题,页面第一次加载页面时,这一行代码是不会报错的,选择完之后提交数据,后台java render一个新页面把body内容替换(也把datalist替换了),再次给这个框绑定data-list方法,然后点击这个datalist框时这一句话就报了cannot read property ' style' of undefined,我之前怀疑这不是一个jquery对象,但是用$()把ul包起来也不行,而且console.log时它确实是一个jquery对象,而且length也为1并没用重复的对象,但是jquery内部似乎就是识别不了,亦或者这个对象和真正的jquery对象有区别?反正最后换成了原生JS才可以解决,各位大神如果有解决方法或是知道问题原因请务必在评论下方指导小弟一二。
html代码 调用代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/datalist.css">
<script src="js/jquery1.8.js"></script>
<script src="js/datalist.js"></script>
<script type="text/javascript">
$(function () {
$('[data-list-id="datalist"]').datalist({
"max-height": "15em"
}, function () {
console.log("callback function");
});
});
</script>
</head>
<body>
<div>
<label for="datalist">select url</label>
<input id="datalist" type="text" data-list>
<ul class="datalist_ul" data-list-id="datalist">
<li class="datalist_li">google</li>
<li class="datalist_li">facebook</li>
<li class="datalist_li">twitch</li>
<li class="datalist_li">baidu</li>
<li class="datalist_li">youtube</li>
<li class="datalist_li">twitter</li>
</ul>
</div>
</body>
</html>
模仿下拉框datalist的jquery插件的一点小经验的更多相关文章
- jquery Combo Select 下拉框可选可输入插件
Combo Select 是一款友好的 jQuery 下拉框插件,在 PC 浏览器上它能模拟一个简单漂亮的下拉框,在 iPad 等移动设备上又能回退到原生样式.Combo Select 能够对选项进行 ...
- jQuery下拉框扩展和美化插件Chosen
Chosen 是一个支持jquery的select下拉框美化插件,它能让丑陋的.很长的select选择框变的更好看.更方便.不仅如此,它更扩展了select,增加了自动筛选的功能.它可对列表进行分组, ...
- select标签的下拉框为图片的插件
1 参考文献: [1] https://github.com/rvera/imag...[2] https://rvera.github.io/image... [3] http://webseman ...
- 集成iscroll 下拉加载更多 jquery插件
一个插件总是经过了数月的沉淀,不断的改进而成的.最初只是为了做个向下滚动,自动加载的插件.随着需求和功能的改进,才有了今天的这个稍算完整的插件. 一.插件主功能: 1.下拉加载 2.页面滚动到底部自动 ...
- Jquery制作--美化下拉框
平常我们用的原生select下拉框,大部分样式没办法修改,导致在不同的浏览器里面会跟设计图的风格大相径庭.所以为了能让它美化起来,就用JQ模拟了一个下拉框,可以随意定义样式.原生的下拉框也保留在div ...
- jQuery实现的3个基础案例(仿QQ列表分组,二级联动下拉框,模拟员工信息管理系统)
1.仿QQ列表分组 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&quo ...
- div自定义下拉框
因为原生的下拉框不能修改其属性,很难美化下拉框. 所以自己用div简单自定义了一下下拉框,想美化直接修改css即可 <!DOCTYPE html> <html lang=" ...
- jquer回显选中select下拉框
公司使用的框架比较旧,没有使用el等表达式. <% String context = request.getContextPath(); String index = (String)reque ...
- JQuery 插件之Ajax Autocomplete(ajax自动完成)搜索引擎自动显示下拉框
平时用百度,谷歌搜索的时候 会有一个下 拉列表进行提示 这是一个非常好的功能 本文要介绍的这个JQuery 插件 名叫Ajax Autocomplete 顾名思义 ajax 也就是用ajax的方式获取 ...
随机推荐
- 【一通百通】C/C++的std标准总结
C/C++发展很多版本标准,sunsky(本人)早就想理理std标准了,让大家有个清晰的了解. 适用C(或C源代码,如C ++,Objective-C和Objective-C ++)的标准: -ans ...
- 自动化利器-YUM仓库搭建实战
本地YUM仓库搭建实战 YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的reposito ...
- 老李分享:Uber究竟是用什么开发语言?
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- 漫谈PHP代码规范
前言 虽说PHP是世界上最好的语言,但是写出来的PHP代码却往往不是最美观的.究其原因,可能正式因为PHP简单易上手,适合快速迭代的特性,导致了我们沉浸在迅速完成需求迭代的窃喜中,却忘记了规范性.忽略 ...
- MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用
在统计查询中,经常会用到count函数,这里是基础的 MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用 -- 创建表 CREATE TABLE `tb ...
- 移动设备真机调试本地程序的Node.js【无需连wifi】
前提: 在某些场景下,我们需要调试我们的Node.js,这很简单,很多编辑器都集成了debug模式,但是某些场景下,我们想在移动设备上运行,在本地debug,这也行,只需要链接在同一个内网,通过ip ...
- 第一个 lua 程序
第一个 lua 程序 lua 提供一个交互式编程模式, 直接在命令行输入 lua 开启 $ lua > -- 此处可以输入 lua 程序 lua 脚本执行时的 2 种方式 lua + lua 脚 ...
- Spring + Mybatis 项目实现动态切换数据源
项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库. 最简单的办法其实就是建两个包,把之前数据源那一套配置copy一份,指向另外的包,但是这样扩展很有限,所有采用下面的办法. ...
- onmouseover事件
根据教学视频写了个onmouseover事件: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- 函数指针|指针函数|C文件操作
body,table { font-family: 微软雅黑; font-size: 10pt } table { border-collapse: collapse; border: solid g ...