jQuery는 사서함 자동 채우기를 구현합니다(드롭다운 프롬프트 사용)_jquery
在做这个功能时候,我参考的是网易注册(http://reg.163.com/reg/reg.jsp?product=urs)中的邮箱栏目所实现的功能与效果。这个功能的目的是使用户在填写邮箱栏目的过程中,在带有邮箱后缀名的菜单的提示下,可以不需要完整输入自己的注册邮箱,达到方便、快捷、友好的效果。在做这个功能的时候,需要充分站在使用者的角度,看怎样设计能够最符合通常情况下人们的使用习惯,又怎样设计反而会让用户感到不便。先来看看功能实现的演示效果图:
在线演示:http://jsfiddle.net/vudr00xc/embedded/result/
①初始状态,邮箱栏目未获得焦点时
以及鼠标点击后获得焦点时
②以空白字符( space , tab ) 以及@开头时,不出现提示菜单
③输入有效字符时,提示下拉菜单出现,用户输入的内容自动添加进菜单,并且第一条提示栏目获得高亮
④输入的字符第一次出现"@"时,输入的"@"并不加入提示菜单
⑤"@"之后出现有效字符时,就会同提示菜单中的邮件后缀从后缀首位起进行比较,把和用户输入的邮箱后缀不同的提示从菜单中去掉。同时过滤后的第一条提示获得高亮。在完全匹配之后,下拉菜单隐藏。
⑥用户删除邮件输入框中的字符时,呈现的效果顺序是⑤图3--->⑤图2---> ⑤图1---> ④图
⑦按下键盘方向键向上或向下使菜单相应提示高亮
⑧鼠标划过菜单提示时,原先的高亮消失,鼠标划过的栏目获得高亮;鼠标移开,保持之前鼠标划过的栏目高亮,直到用户继续输入字符,栏目失去高亮,同时第一条可见的提示高亮
⑨点击高亮提示或者高亮处回车,自动填充邮箱元素,选择完成,菜单收起
⑩在下拉菜单展开时,鼠标点击页面任何元素,菜单收起
注:此功能不包括正则验证邮箱格式。
本功能没有用到什么复杂的知识点,只有简单的JS字符串的匹配 ( match )、位置检索 ( indexOf ) 、截取 ( substr ) 以及jQuery选择器的应用等。更主要的是对功能的逻辑分析要思路清晰,以及思考如何设计能真正使用户操作简便。这个功能的事件主要包括:
代码分析:
HTML和CSS代码:
HTML
<div class="ipt"> <input type="text" name="uemail" id="uemail" placeholder="请输入常用邮箱"/> <ul class="autoul"></ul> </div>
CSS
.ipt{ width:218px;}/* 输入框外围div */ input{ margin:0; padding-left:15px; padding-right:15px; width:184px;}/* 输入框 */ ul.autoul{ /* 下拉菜单 */ width:216px; margin:0px; margin-top:-5px; padding:0px; color:#666; border:1px solid #666; border-top:0; overflow:hidden; } ul.autoul li.autoli{ /* 下拉菜单li */ height:30px; display:block; list-style-type:none; text-align:left; cursor:pointer; font-size:14px; line-height:30px; padding-left:15px; padding-right:15px; overflow:hidden; /*当对象内文本溢出时显示省略标记*/ text-overflow:ellipsis; } .lihover{ /* 下拉菜单li高亮样式 */ background-color:#eee; } span{ padding-right:2px;}/* li下文字 */ .showli{ display:block;}/* 经过过滤的li的样式 */
在DOM加载完毕后,初始化邮件列表并隐藏下拉菜单,JS代码片段:
$(function(){ //初始化邮箱列表 var mail = new Array("sina.com","126.com","163.com","gmail.com","qq.com","vip.qq.com","hotmail.com","sohu.com","139.com","vip.sina.com","21cn.cn","189.cn","sina.cn"); //把邮箱列表加入下拉 for(var i=0;i<mail.length;i++){ var $liElement = $("<li class=\"autoli\"><span class=\"ex\"></span><span class=\"at\">@</span><span class=\"step\">"+mail[i]+"</span></li>"); $liElement.appendTo("ul.autoul"); } //下拉菜单初始隐藏 $(".autoul").hide(); //其他事件.......... });
输入框$("#uemail")的keyup和keydown事件是该功能的主要事件,输入字符时之所以用keyup事件而不用keydown事件是因为keyup事件在用户将键盘按键抬起时触发,是整个按键动作的最后阶段,所以在抬起按键时能看到相应的动作即实时看到输入的字符;而使用keydown事件时,只有在下一次按下键盘按键时才能看到上一次按下按键触发的动作,所以keydown事件在通过键盘获得页面控制方面用的比较多,因此在使用键盘方向键↑↓选择菜单提示时使用keydown事件。
//在邮箱输入框输入字符 $("#uemail").keyup(function(){ //........ })
邮件输入框$("#uemail")的keyup事件:
①有输入的按键,使输入框有长度( 因为删除事件也是判断匹配以及长度,所以只需要添加删除事件特有的动作,而不必在此处排除删除事件 )
if(event.keyCode!=38 && event.keyCode!=40 && event.keyCode!=13){ //菜单展现,需要排除空格开头和"@"开头 if( $.trim($(this).val())!="" && $.trim(this.value).match(/^@/)==null ) { $(".autoul").show(); //同时去掉原先的高亮,把第一条提示高亮 if($(".autoul li.lihover").hasClass("lihover")) { $(".autoul li.lihover").removeClass("lihover"); } $(".autoul li:visible:eq(0)").addClass("lihover"); }else{//如果为空或者"@"开头 $(".autoul").hide(); $(".autoul li:eq(0)").removeClass("lihover"); } //把输入的字符填充进提示,有两种情况:1.出现"@"之前,把"@"之前的字符进行填充;2.出现第一次"@"时以及"@"之后还有字符时,不填充 //出现@之前 if($.trim(this.value).match(/[^@]@/)==null){//输入了不含"@"的字符或者"@"开头 if($.trim(this.value).match(/^@/)==null){ //不以"@"开头 $(this).next().children("li").children(".ex").text($(this).val()); } }else{ //输入字符后,第一次出现了不在首位的"@" //当首次出现@之后,有2种情况:1.继续输入;2.没有继续输入 //当继续输入时 var str = this.value;//输入的所有字符 var strs = new Array(); strs = str.split("@");//输入的所有字符以"@"分隔 $(".ex").text(strs[0]);//"@"之前输入的内容 var len = strs[0].length;//"@"之前输入内容的长度 if(this.value.length>len+1){ //截取出@之后的字符串,@之前字符串的长度加@的长度,从第(len+1)位开始截取 var strright = str.substr(len+1); //正则屏蔽匹配反斜杠"\" if(strright.match(/[\\]/)!=null){ strright.replace(/[\\]/,""); return false; } //遍历li $("ul.autoul li").each(function(){ //遍历span //$(this) li $(this).children("span.step").each(function(){ //@之后的字符串与邮件后缀进行比较 //当输入的字符和下拉中邮件后缀匹配并且出现在第一位出现 //$(this) span.step if($("ul.autoul li").children("span.step").text().match(strright)!=null && $(this).text().indexOf(strright)==0){ //class showli是输入框@后的字符和邮件列表对比匹配后给匹配的邮件li加上的属性 $(this).parent().addClass("showli"); //如果输入的字符和提示菜单完全匹配,则去掉高亮和showli,同时提示隐藏 if(strright.length>=$(this).text().length){ $(this).parent().removeClass("showli").removeClass("lihover").hide(); } }else{ $(this).parent().removeClass("showli"); } if($(this).parent().hasClass("showli")){ $(this).parent().show(); $(this).parent("li").parent("ul").children("li.showli:eq(0)").addClass("lihover"); }else{ $(this).parent().hide(); $(this).parent().removeClass("lihover"); } }); }); }else{ //"@"后没有继续输入时 $(".autoul").children().show(); $("ul.autoul li").removeClass("showli"); $("ul.autoul li.lihover").removeClass("lihover"); $("ul.autoul li:eq(0)").addClass("lihover"); } } }//有效输入按键事件结束
②按键为backspace(8)或是delete(46)
if(event.keyCode == 8 || event.keyCode == 46){ $(this).next().children().removeClass("lihover"); $(this).next().children("li:visible:eq(0)").addClass("lihover"); }//删除事件结束
③按键为方向键↑(38)
if(event.keyCode == 38){ //使光标始终在输入框文字右边 $(this).val($(this).val()); }//方向键↑结束
④按键为回车键(13)
if(event.keyCode == 13){ if($("ul.autoul li").is(".lihover")) { $("#uemail").val($("ul.autoul li.lihover").children(".ex").text() + "@" + $("ul.autoul li.lihover").children(".step").text()); } $(".autoul").children().hide(); $(".autoul").children().removeClass("lihover"); $("#uemail").focus();//回车后输入栏获得焦点 }
至此keyup事件结束。
#("#uemail")的keydown事件
$("#uemail").keydown(function(){ if(event.keyCode == 40){ //按键为↓时.... } if(event.keyCode == 38){ //按键为↑时.... } })
⑤按键为方向键 ↓ (40)
if(event.keyCode == 40){ //当键盘按下↓时,如果已经有li处于被选中的状态,则去掉状态,并把样式赋给下一条(可见的)li if ($("ul.autoul li").is(".lihover")) { //如果还存在下一条(可见的)li的话 if ($("ul.autoul li.lihover").nextAll().is("li:visible")) { if ($("ul.autoul li.lihover").nextAll().hasClass("showli")) { $("ul.autoul li.lihover").removeClass("lihover") .nextAll(".showli:eq(0)").addClass("lihover"); } else { $("ul.autoul li.lihover").removeClass("lihover").removeClass("showli") .next("li:visible").addClass("lihover"); $("ul.autoul").children().show(); } } else { $("ul.autoul li.lihover").removeClass("lihover"); $("ul.autoul li:visible:eq(0)").addClass("lihover"); } } }
⑥按键为方向键 ↑ (38)
if(event.keyCode == 38){ //当键盘按下↓时,如果已经有li处于被选中的状态,则去掉状态,并把样式赋给下一条(可见的)li if($("ul.autoul li").is(".lihover")){ //如果还存在上一条(可见的)li的话 if($("ul.autoul li.lihover").prevAll().is("li:visible")){ if($("ul.autoul li.lihover").prevAll().hasClass("showli")){ $("ul.autoul li.lihover").removeClass("lihover") .prevAll(".showli:eq(0)").addClass("lihover"); }else{ $("ul.autoul li.lihover").removeClass("lihover").removeClass("showli") .prev("li:visible").addClass("lihover"); $("ul.autoul").children().show(); } }else{ $("ul.autoul li.lihover").removeClass("lihover"); $("ul.autoul li:visible:eq("+($("ul.autoul li:visible").length-1)+")").addClass("lihover"); } }else{ //当键盘按下↓时,如果之前没有一条li被选中的话,则第一条(可见的)li被选中 $("ul.autoul li:visible:eq("+($("ul.autoul li:visible").length-1)+")").addClass("lihover"); } }
至此keydown事件结束。
⑦当鼠标点击下拉菜单的具体一条内容时
$(".autoli").click(function(){ $("#uemail").val($(this).children(".ex").text()+$(this).children(".at").text()+$(this).children(".step").text()); $(".autoul").hide(); }); //鼠标点击下拉菜单具体内容事件结束
⑧当鼠标点击document时,下拉隐藏
$("body").click(function(){ $(".autoul").hide(); }); //鼠标点击document事件结束
⑨鼠标划过li时
$("ul.autoul li").hover(function(){ if($("ul.autoul li").hasClass("lihover")){ $("ul.autoul li").removeClass("lihover"); } $(this).addClass("lihover"); });
至此,功能完成。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Laravel 이메일 전송이 실패 할 때 반환 코드를 얻는 방법. Laravel을 사용하여 응용 프로그램을 개발할 때 종종 확인 코드를 보내야하는 상황이 발생합니다. 그리고 실제로 ...

데이터베이스 산 속성에 대한 자세한 설명 산 속성은 데이터베이스 트랜잭션의 신뢰성과 일관성을 보장하기위한 일련의 규칙입니다. 데이터베이스 시스템이 트랜잭션을 처리하는 방법을 정의하고 시스템 충돌, 전원 중단 또는 여러 사용자의 동시 액세스가 발생할 경우에도 데이터 무결성 및 정확성을 보장합니다. 산 속성 개요 원자력 : 트랜잭션은 불가분의 단위로 간주됩니다. 모든 부분이 실패하고 전체 트랜잭션이 롤백되며 데이터베이스는 변경 사항을 유지하지 않습니다. 예를 들어, 은행 송금이 한 계정에서 공제되지만 다른 계정으로 인상되지 않은 경우 전체 작업이 취소됩니다. BeginTransaction; updateAccountssetBalance = Balance-100WH

sqllimit 절 : 쿼리 결과의 행 수를 제어하십시오. SQL의 한계 절은 쿼리에서 반환 된 행 수를 제한하는 데 사용됩니다. 이것은 대규모 데이터 세트, 페이지 진화 디스플레이 및 테스트 데이터를 처리 할 때 매우 유용하며 쿼리 효율성을 효과적으로 향상시킬 수 있습니다. 구문의 기본 구문 : SelectColumn1, Collect2, ... Fromtable_namelimitnumber_of_rows; 번호_of_rows : 반환 된 행 수를 지정하십시오. 오프셋이있는 구문 : SelectColumn1, Column2, ... Fromtable_namelimitOffset, number_of_rows; 오프셋 : skip

이 기사는 MySQL 데이터베이스의 작동을 소개합니다. 먼저 MySQLworkBench 또는 명령 줄 클라이언트와 같은 MySQL 클라이언트를 설치해야합니다. 1. MySQL-Uroot-P 명령을 사용하여 서버에 연결하고 루트 계정 암호로 로그인하십시오. 2. CreateABase를 사용하여 데이터베이스를 작성하고 데이터베이스를 선택하십시오. 3. CreateTable을 사용하여 테이블을 만들고 필드 및 데이터 유형을 정의하십시오. 4. InsertInto를 사용하여 데이터를 삽입하고 데이터를 쿼리하고 업데이트를 통해 데이터를 업데이트하고 DELETE를 통해 데이터를 삭제하십시오. 이러한 단계를 마스터하고 일반적인 문제를 처리하는 법을 배우고 데이터베이스 성능을 최적화하면 MySQL을 효율적으로 사용할 수 있습니다.

sqlSelect 문에 자세한 설명 선택 설명은 데이터베이스 테이블에서 데이터를 추출하는 데 사용되는 SQL에서 가장 기본적이고 일반적으로 사용되는 명령입니다. 추출 된 데이터는 결과 세트로 표시됩니다. SELECT STECT SYNTAX SELTCOLUMN1, CORMENT2, ... FROMTABLE_NAMEWHERECONDITIONORDERBYCOLUMN_NAME [ASC | DESC]; 명령문 구성 요소 선택 절 (select) : 검색 할 열을 지정하십시오. * 사용 * 모든 열을 선택하십시오. 예를 들면 : selectFirst_name, last_namefromementloinees; 소스 절 (fr

Go Language Registration Function에서 이메일 전송 효율성 최적화. 학습 과정에서 언어 백엔드 개발 과정에서 사용자 등록 기능을 구현할 때는 종종 충동을 보내야합니다 ...

이 기사는 MySQL 데이터베이스 테이블의 설계 및 제작을 소개합니다. 1. 관계형 데이터베이스, 테이블, 필드 등과 같은 주요 개념을 이해하고 패러다임 설계를 따르십시오. 2. SQL 문을 사용하여 CreateTable 문과 같은 테이블을 만들고 기본 키 및 고유 키와 같은 제약 조건을 설정하십시오. 3. 인덱스를 추가하여 쿼리 속도를 향상시키고 외래 키를 사용하여 데이터 무결성을 유지합니다. 4. 부적절한 필드 유형 선택, 불합리한 인덱스 설계 및 데이터 무결성을 무시하는 것과 같은 문제를 피하십시오. 5. 적절한 저장 엔진을 선택하고 SQL 문 및 데이터베이스 매개 변수를 최적화하여 성능을 향상시킵니다. 이러한 단계를 배우면 MySQL 데이터베이스 테이블을 효율적으로 작성하고 관리 할 수 있습니다.

MySQL은 복잡한 논리를 캡슐화하고 코드 재사용 성과 보안을 향상시키는 사전 컴파일 된 SQL 코드 블록 인 저장 프로 시저를 제공합니다. 핵심 기능에는 루프, 조건부, 커서 및 거래 제어가 포함됩니다. 저장된 절차를 통해 사용자는 내부 구현에주의를 기울이지 않고 간단히 입력하고 출력하여 데이터베이스 작업을 완료 할 수 있습니다. 그러나 구문 오류, 권한 문제 및 논리 오류와 같은 일반적인 문제에주의를 기울이고 성능 최적화 및 모범 사례 원칙을 따를 필요가 있습니다.
