jQuery-input输入框下拉提示层

效果图

 

代码部分

// JavaScript Document
(function($){$.fn.extend({"changeTips":function(value){value = $.extend({divTip:""},value)var $this = $(this);var indexLi = 0;//点击document隐藏下拉层$(document).click(function(event){if($(event.target).attr("class") == value.divTip || $(event.target).is("li")){var liVal = $(event.target).text();$this.val(liVal);blus();}else{blus();}})//隐藏下拉层function blus(){$(value.divTip).hide();}//键盘上下执行的函数function keychang(up){if(up == "up"){if(indexLi == 1){indexLi = $(value.divTip).children().length-1;}else{indexLi--;}}else{if(indexLi ==  $(value.divTip).children().length-1){indexLi = 1;}else{indexLi++;}}$(value.divTip).children().eq(indexLi).addClass("active").siblings().removeClass();    }//值发生改变时function valChange(){var tex = $this.val();//输入框的值var fronts = "";//存放含有“@”之前的字符串var af = /@/;var regMail = new RegExp(tex.substring(tex.indexOf("@")));//有“@”之后的字符串,注意正则字面量方法,是不能用变量的。所以这里用的是new方式。//让提示层显示,并对里面的LI遍历if($this.val()==""){blus();}else{$(value.divTip).show().children().each(function(index) {var valAttr = $(this).attr("email");if(index==1){$(this).text(tex).addClass("active").siblings().removeClass();}//索引值大于1的LI元素进处处理if(index>1){//当输入的值有“@”的时候if(af.test(tex)){//如果含有“@”就截取输入框这个符号之前的字符串fronts = tex.substring(tex.indexOf("@"),0);$(this).text(fronts+valAttr);//判断输入的值“@”之后的值,是否含有和LI的email属性if(regMail.test($(this).attr("email"))){$(this).show();}else{if(index>1){$(this).hide();}    }}//当输入的值没有“@”的时候else{$(this).text(tex+valAttr);}}})}    }//输入框值发生改变的时候执行函数,这里的事件用判断处理浏览器兼容性;if($.browser.msie){$(this).bind("propertychange",function(){valChange();})}else{$(this).bind("input",function(){valChange();})}//鼠标点击和悬停LI
            $(value.divTip).children().hover(function(){indexLi = $(this).index();//获取当前鼠标悬停时的LI索引值;if($(this).index()!=0){$(this).addClass("active").siblings().removeClass();}    })//按键盘的上下移动LI的背景色$this.keydown(function(event){if(event.which == 38){//向上keychang("up")}else if(event.which == 40){//向下
                    keychang()}else if(event.which == 13){ //回车var liVal = $(value.divTip).children().eq(indexLi).text();$this.val(liVal);blus();}})                }    })    
})(jQuery)

 

一、功能分析:

  1.input输入框的值,发生变化时,显示提示的下拉层;

  2.input输入框的值,发生变化时,显示提示的下拉层,会根据输入的内容自动往“@”前面添加;

  3.input输入框的值,发生变化时,显示提示的下拉层,会根据输入的内容对下拉层“@”后面的内容进行筛选;

  4.点击下拉层里面的提示内容,会将其值,填充到输入框;

  5.按下鼠标回车键会将其选中的下拉层里的内容,填充到输入框;

  6.按键盘的“向上”或“向下”的方向键,可以在下拉层的选项中移动(循环移动,改变当前LI的背景色);

  7.鼠标悬停在下拉层的LI上面时,会有一个背景色。

 

二、功能实现:

  1.input输入框的值,发生变化时的事件是:propertychange(IE)或input(标准);

  2.在发生propertychange事件的时候,取其输入框的值,再取其“@”前面的值,并赋值给下拉层里面的LI加上LI的email属性值;

  3.在发生propertychange事件的时候,

    3.1取其输入框的值,再取其“@”后面的值,

    3.2并将这个值与下拉层里面的LI的email属性值进行正则匹配;

       这里要注意,正则字面量方法,是不能用变量的。所以这里用的是new方式。

      这里的正则是取的输入框“@”后面的值,所以正则,是变化的。而LI的EMAIL属性值是不变的

  4.这里用了一个事件委托方式,将点击事件绑定给document,然后通过判断,点击时最初触发的DOM元素,是什么。来决定,

    4.1否隐藏下拉提示层?

    4.2还是需要将下拉层,选中的值,赋给输入框

    (这里不能直接使用,当输入框失去焦点时,隐藏下拉提示层,因为会与点击下拉层,将其值填入输入框,这个功能有逻辑上的矛盾;)

  5.和上面第4条差不多;

  6.就是要注意,在鼠标悬停时,把当前的LI索引存入一个全局变量当中,这样就可以告诉“向上”或“向下”按键时,的起始位置了;

  7.遍历LI,给它们的悬停事件都绑定一个改变其当前背景色的处理函数;

 

感谢“妙味课堂”提供的视频

DEMO下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipes 2016 CI 6 安装

一、双击安装包,打开,点击“Next” 二、 同意,Next 三、选择安装路径,然后点击Next 四、选择32位或者是64位后,点击Next开始安装。 五、去掉立即运行这个勾,点击完成。 六、找到破解目录文件,全…

netapp存储常用命令

cf status #检查Cluster功能的当前状态 cf enable/disable #启用禁用cluster cf takeover #cluster强制接管,partner在接管模式下切换到partner管理界面 cf giveback #在接管模式下,将服务返回给原节点 cifs shares #查看CIFS共享信息 df –Ag #查看存储所建组的…

Java的中排序方式

实体类: public class Person {public String getCode() {return code;}public void setCode(String code) {this.code code;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}publi…

WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大小和旋转

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ] 由于上周主要做了项目组产品架构、给公司新员工培训以及其他会议等事情,在OpenExpressApp对建模支持的初步计划中我列了一些建模任务还没有开展,其中参考部分在…

JDBC最基本CRUD操作工具类

以连接SqlServer2008 R2为例 import java.sql.*;public final class JdbcUtils {private String url;private String user;private String password;public JdbcUtils(String url,String user,String password){this.url url;this.user user;this.password password;}stat…

JDBC中使用PreparedStatement执行SQL语句并管理结果集

基本说明 1、使用PreparedStatement在对反复操作多条结构相似的SQL语句时效率更高,并且可以使用参数替代变量,可以防止SQL注入。 2、PreparedStatement也提供了 execute() 、 executeUpdate() 、 executeQuery() 三个方法来执行crud操作&#xff0c…

Ubuntu下安装Gerrit

2019独角兽企业重金招聘Python工程师标准>>> 目标 配置Gerrit使用mysql数据库(原因:本人比较熟悉mysql) 使用http授权模式,使用apache反向代理。 SMTP使用163的个人邮箱 软件版本 Ubuntu 12.04 Gerrit 2.4.1 Apache 2.…

JDBC中使用RowSet包装结果集

背景 C#中有了DataSet,可以把底层数据读取到内存中进行离线操作。操作完成再同步到底层数据源。Java中也提供了类似的功能——RowSet。 和ResultSet相比,RowSet默认是可以滚动、可更新、可序列化的结果集合,而且作为Javabean使用。并支持离…

招几个兄弟和我一起做项目

为什么80%的码农都做不了架构师?>>> 个人名义发表,有事情站内联系。不说太多,反正能学到东西。呵呵。 工作内容: 1 负责项目中相关模块从应用到Framework部分(包括Java层和Native层)的开发 2 负…

JDBC中开启事务的批量插入操作

直接上代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class Batch {private String url;private String user;private String password;public Batch(String url,String user,String password){this.url url;this.user…

C#中? 、?? 、?. 、??= 的用法和说明

一、可空类型修饰符< ? > 引用类型能用空引用来表示一个表示一个不存在的值&#xff0c;但是值类型不能。例如&#xff1a; string str null; int i null;//编译报错 为了使值类型也能使用可空类型&#xff0c;就可以用 " ? "来表示&#xff0c;表现形式…

小议 find

说find之前我们先说两个概念&#xff1a;文件查找&#xff1b;文本过滤。这是两个不同的概念&#xff0c;所使用的命令也是不一样的。 文件查找&#xff1a;查找目录中的文件 文本过滤&#xff1a;查找文本中的行 文本过滤的命令有&#xff1a;grep 、fgrep 、egrep 等 格式为…

c++内存访问越界

http://blog.vckbase.com/arong/archive/2009/12/30/40598.html 1. 原理分析 经常有些新C&#xff0b;&#xff0b;程序员问&#xff1a;C&#xff0b;&#xff0b;的类的成员个数是不是有限制&#xff0c;为什么我加一个变量后程序就死了&#xff1f;或者说&#xff1a;是不是…

Java开发常用命名规范

挑几个重点&#xff1a; 一、类和接口的首字母及任何任何中间单词的首字母必须是大写。 接口可以带 "I" 前缀或者 "able"、"ible" 、"er"等后缀。推荐接口命名为&#xff1a; I 模块名 业务名称 Service后缀。实现接口的类文件命…

Android系统Recovery工作原理之使用update.zip升级过程分析(二)---u...

2019独角兽企业重金招聘Python工程师标准>>> Android系统Recovery工作原理之使用update.zip升级过程分析&#xff08;二&#xff09;---update.zip差分包问题的解决 在上一篇末尾提到的生成差分包时出现的问题&#xff0c;现已解决&#xff0c;由于最近比较忙&#…

Java编写一个WebService并在Tomcat上发布

本例采用Myeclipse 2016 CI 6&#xff0c;JDK1.8 。新建一个Web Service Project。 选择如下设置&#xff1a; 在src目录下建个包: 编写一个接口&#xff0c;其中一个方法返回ArrayList&#xff0c;另一个方法返回JSON&#xff1a; package Services; import java.sql.SQLExce…

ftp简介

简介 ftp基于TCP服务&#xff0c;不支持UDP&#xff0c;使用21(控制端口)和20(数据端口)&#xff0c;但ftp的数据端口并不总是20. ftp模式 主动模式客户端从一个任意的端口N&#xff08;N>1024&#xff09;连接到FTP服务器的命令端口(21端口)。然后客户端开始监听端口N1&…

Windows环境下搭建Tomcat

下载Tomcat&#xff0c;点击这里下载Tomcat 解压到指定目录: 配置环境变量&#xff1a;右键“我的电脑” ——属性——高级系统设置——环境变量 配置三个环境变量&#xff1a; 在系统变量里新建变量名&#xff1a;CATALINA_BASE&#xff0c;变量值&#xff1a;D:\apache-t…

C#非泛型集合类-使用HashTable组织数据

HashTable称为哈希表&#xff0c;是System.Collections命名空间中的一个重要的类。与ArrayList不同&#xff0c;哈希表可以存储键/值(key/value)对的集合。如果把哈希表当做字典&#xff0c;那么“键”就是字典中查的单词&#xff0c;“值”就是关于单词解释内容&#xff0c;正…