模仿下拉框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的方式获取 ...
随机推荐
- piwik安装部署最佳实践
1.piwik介绍 Piwik是一个PHP和MySQL的开放源代码的Web统计软件,它给你一些关于你的网站的实用统计报告,比如网页浏览人数,访问最多的页面,搜索引擎关键词等等. Piwik拥有众多不同 ...
- vuejs学习笔记(2)--属性,事件绑定,ajax
属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, ...
- css实现超出部分用...代替
如果是一行的话 css为 white-space: nowrap: 保证文本内容不会自动换行,如果多余的内容会在水平方向撑破单元格. overflow: hidden: 隐藏超出单元格的部分. tex ...
- Git版本切换
前面的话 本文将以一个简单实例的形式来介绍Git版本切换 初始版本 首先,在一个自定义的位置,创建目录a,比如在D盘下 [注意]本文会用到一些常用的Linux的Shell命令,详细信息移步至此 先使用 ...
- 初步了解关于js跨域问题
js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...
- ThreadLocal学习笔记
首先,ThreadLocal是Java语言提供的用于支持线程局部变量的标准实现类.很多时候,ThreadLocal与Synchronized在功能上有一定的共性,都可以用来解决多线程环境下线程安全问题 ...
- TCP/IP笔记(六)TCP与UDP
终于来到了传输层,这个面试问的最多了,内容比较多,要分两篇来总结,这是第一篇
- 自动获取代理IP信息的例子,含代码,分享哦,
/// <summary> /// 读取URL数据内容 /// </summary> /// <param name="url">网址</ ...
- 关于REST的浅显了解
REST 是一种软件架构风格 1.定义 REST即表述性状态传递(Representational State Transfer) 是一组架构约束条件和原则.是设计风格而不是标准. 满足这些约束条件和 ...
- 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...