>  기사  >  웹 프론트엔드  >  입력 상자가 Baidu와 유사한 검색 프롬프트를 구현하도록 합니다(jquery 이벤트 모니터링 기반)_jquery

입력 상자가 Baidu와 유사한 검색 프롬프트를 구현하도록 합니다(jquery 이벤트 모니터링 기반)_jquery

WBOY
WBOY원래의
2016-05-16 17:01:381274검색

아주 멋진 효과입니다. Baidu와 Google은 이 효과를 구현하는 코드를 인터넷에서 쉽게 찾을 수 있다고 생각했습니다. 실제로 이러한 요구 사항을 접했을 때 실제로는 찾을 수 없다는 것을 알았습니다. 그래서 이 효과를 전체 프레임워크에 통합했기 때문에 별도로 캡슐화하지 않았습니다.

요구 사항:
변경 사항이 있을 때 일반적으로 사용되는 키워드를 얻으려면 Baidu 검색과 유사한 프롬프트가 있는 입력 상자를 구현하세요. 데이터는 시스템 데이터베이스에서 가져오며 마우스 선택 또는 키보드 선택을 지원합니다.

아이디어:
프레임워크의 일관된 아이디어는 클래스를 모니터링 입구로 사용하고 데이터를 데이터 전송으로 사용하는 것입니다.
실시간 변경 모니터링은 입력 및 속성 변경 이벤트를 모니터링하여 달성됩니다. 주류, 속성 변경은 즉, 아시다시피 ;
Ajax를 통해 게시 작업을 구현하고 반환된 콘텐츠를 선택 상자와 유사한 형태로 표시합니다.
위쪽 키(38), 아래쪽 키(40)를 모니터링합니다. , 키보드의 키 (13)을 입력하고 keydown을 바인딩하여 event.keycode 구현을 결정합니다.
키보드 동작과 완벽하게 통합되어야 하는 마우스 오버 및 클릭 이벤트를 모니터링합니다. 입력 콘텐츠 요구 사항은 알려진 옵션과 일치해야 하며, 흐림 이벤트를 모니터링하여 초점 변경이 허용되는지 확인하세요.

구현 코드:

코드 복사 코드는 다음과 같습니다.

//COoL

//프롬프트 레이어를 저장할 전역 변수 정의
var liketips

//변경 사항 수신 또는 포커스 이벤트 가져오기

//Chrome 및 Firefox 브라우저와 함께 제공되는 자동 프롬프트 비활성화
$('.getsearchjson').attr("autocomplete", "off")
$('.getsearchjson').bind ( "propertychange input focus",function(event){
$this=$(this);
if(event.type!='focus'){
//변경사항이 있으면 상태는 다시 선택해야 합니다. 순수 수동 입력으로 인해 값을 삽입할 수 없기 때문입니다.
$this.data('ok',false)
}

/ /입력 상자 위치를 가져와서 프롬프트 레이어가 나타나야 하는지 계산합니다. Position
var top=1*$this.offset().top 25
var left=1*$this.offset().left; 🎜> var width=1*$this.width( ) 12;

//저장소 팁 레이어를 다시 작성하고 적절한 위치에 표시
$(liketips).remove(); liketips=document.createElement('div');
$liketips=$(liketips);
//여기서는 클래스 스타일이 제공되지 않습니다. 가장 중요한 것은 position:absolute입니다.
$liketips.addClass( "liketips");
$liketips.css({top: top 'px',left:left 'px',width:width 'px'})

//로드 중인 동적 이미지 표시 로딩 전
$liketips.append('')
$liketips.appendTo($this.parent()) ;
$liketips.show();

//json을 얻기 위해 ajax를 정의하고, type 매개변수는 data-type을 통해 설정하며, 키워드는 지금까지 입력한 값입니다
//반환값은 테이블 형식으로 표시됩니다
$.post('/data/search.do ',{type:$this.data('type'),keyword:$this.val()},function (json){
$liketips.empty();
var htmlcode=""
for(var i= 0;i //여기서 value와 title을 사용해야 하므로 data-value를 사용하여 매개변수를 하나 더 전달하고 Enter 키를 누른 후 해당 위치에 값을 할당하거나 select
htmlcode ='' 를 완벽하게 대체하는 마우스 클릭 '; ;/tbody>드롭다운 상자에서"을 선택하세요.
//로딩 교체 콘텐츠가 포함된 동적 이미지
$liketips.html(htmlcode) ;
},"json")
})

//포커스가 사라지면 데이터가 다음 위치에서 나오는지 확인하세요. 옵션을 설정하고 프롬프트 상자를 숨깁니다
$('.getsearchjson').blur( function(){
//마우스를 클릭할 때 클릭하기 전에 흐림 동작이 해결되므로 setTimeout은 이 문제를 해결합니다. $ OldThis = $ (this); settimeout (function () {
if ($ OldThis.Data ( 'OK'))
$ (liketips), 협력 해 주셔서 감사합니다. ');
                      $oldthis.focus();                  );

//키보드 동작 모니터링
$('.getsearchjson').keydown(function(event){
//console.log(event.keyCode);
$this =$(this);
if(event.keyCode==40){
//키가 눌려졌습니다
$nowtr=$('tr.selectedtr')
//그렇다면 선택 항목이 있으면 아래로 이동하고, 그렇지 않으면 메뉴에서 첫 번째
를 선택합니다. if($nowtr.length>0){
$nexttr=$nowtr.next('tr')
마지막 옵션으로 다음 항목으로 이동하고 그렇지 않으면 첫 번째 항목으로 이동합니다.
                                                                     .addClass('selectedtr')                                          ; 경우 이미 선택되어 있으면 아래로 내려갑니다. 그렇지 않으면 메뉴에서 첫 번째
를 선택합니다. if($nowtr.length>0){
$prevtr=$nowtr.prev('tr')
//If 마지막 옵션이 아닌 다음 항목으로 이동하고 그렇지 않으면 첫 번째 항목으로 이동합니다.
                                                                                   > 선택됨)
;
                                                                                                                         selectedtr')
if($nowtr.length==1){
//data-valueto 매개변수를 통해 입력 상자에서 구성한 값 저장 항목에 값을 설정합니다. 일반적으로 숨겨진 값입니다. item
$valuefield=$('input[name=' $this.data('valueto') ']')
            $valuefield.val($nowtr.data('value')); $nowtr.text())
                                                                                                                              ).fadeOut('fast')
       return false;
//console.log(event.keyCode);
return true;
})

//마우스 움직임을 듣고, 마우스를 올리면 선택한 항목이 변경됩니다.
$(document ).delegate('.liketips td','mouseover',function(){
$nowtr=$(this).parent();
$nowtr.siblings('tr').removeClass();
$nowtr.addClass('selectedtr');
});

//마우스 움직임을 듣고 클릭하여 선택
$(document).delegate('.liketips td' ,'click',function(){
$nowtr=$(this).parent();
if($nowtr.length==1){
//에 해당하는 입력 상자를 가져옵니다. 프롬프트 레이어
$ InputField = $ nowtr.parent ().Parent ().Siblings ('Input.getsearchjson'); 값은 일반적으로 숨겨진 항목
$valuefield에 저장됩니다. =$('input[name=' $inputfield.data('valueto') ']');
$valuefield.val($nowtr.data ('value'))
$inputfield.val( $nowtr.text());
$inputfield.data('ok', true)
}
$(liketips).fadeOut('fast'));



여기서 CSS는 공개되지 않습니다.



입력 상자가 Baidu와 유사한 검색 프롬프트를 구현하도록 합니다(jquery 이벤트 모니터링 기반)_jquery

코드 복사

코드는 다음과 같습니다: //크롬 및 파이어폭스 브라우저와 함께 제공되는 자동 프롬프트를 비활성화합니다$this.attr("autocomplete","off");

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.