2013-09-04 4 views
1

내 웹 사이트에 대한 자동 완성 플러그인을 작성했습니다.이 플러그인은 파일 경로와 검색 데이터를 취한 다음 결과를 얻기 위해 게시물을 작성합니다. 내가 깨달은 점은 입력의 모든 키 입력에 게시하고 있는데 좋지 않다는 것입니다. 그래서 마지막 키 입력 후 검색을 1 초 (또는 .5 초) 만 수행하는 타임 아웃을 추가하는 것이 좋습니다. 불행히도, 그것은 setTimeout 내 함수를 찾을 수없는 것, 그리고 나는 왜 모르겠어요. FireBug의 특정 오류는 "ReferenceError : 검색이 정의되지 않았습니다."시간 초과를 사용하지 않으면 검색이 정상적으로 호출됩니다.이 문제를 해결하는 데 도움이되는 정보 (범위 문제와 같음)는 좋을 것입니다. 다음은 코드를 정리 한 것입니다 (자세한 내용은 더 자세히 설명합니다). 검색 기능과 키 업은 중요한 부분입니다.이 기능을 사용할 수있게되면 setTimeout 바로 위의 항목을 함수 (가정 변수가 확인 통과). 분명히 나는 ​​그것을 덮어하고 시간이 경과 한 후 한 번만 호출 할 수 있도록 변수에의 setTimeout을 지정해야합니다.jQuery 플러그인 하위 함수 및 setTimeout

jQuery.fn.autocomplete = function (pathOption, sendData) { 
function search() { 
    console.log(this); 
} 

var $inputBox = $(this), onWrapper = false; 
$inputBox.keyup(function() { 
    if ($(this).val().length >= 3 && $(this).val() != $(this).data('placeholder')) { 
     $.extend(sendData, { search: $(this).val() }); 
     $.post(SITEROOT + pathOption, sendData, function (data) { 
      if (data.length > 0) { 
       $resultsDiv.html(data).slideDown(); 
      } else $resultsDiv.slideUp(); 
     }); 

     setTimeout('search', 1000); 
    } else $resultsDiv.slideUp(); 
}); 

을}

답변

2

변경 대신 문자열 함수 참조를 사용하는 :

setTimeout(search, 1000); 

당신은 setTimeout()와 문자열을 사용하지 않으려는 거의 않았다. 이런 함수 참조를 사용하는 경우 함수가 setTimeout() 호출 범위 내에있는 한 제대로 작동합니다.


P. setTimeout('search()', 1000)이어야하는 문자열을 사용하는 경우 search 함수는 일반적으로 어쨌든 바람직하지 않은 전역 범위에 있어야합니다. setTimeout() 문자열을 사용하지 마십시오. 대신 자바 스크립트 함수 참조를 사용하십시오 (첫 번째 예와 같이). 이 작업을하기 위해 setTimeout()을 사용하려는 경우


는 참고로, 다음 알고리즘은 일반적으로 예시 한 것보다 더 복잡합니다. 타이머 ID를 setTimeout()에서 저장해야하므로 키 이벤트가 발생할 때마다 이전 타이머를 취소하고 새 타이머를 시작할 수 있습니다. 이렇게하면 사용자가 입력을 일시 중지 한 후 1 초 후에 게시물을 보냅니다 (이러한 유형의 동작에 대한 일반적인 알고리즘).

+0

좋아요, 잠시 동안 setTimeout을 사용하지 않았고 분명히 실패한'setTimeout (search(), 1000)'을 먼저 시도 했으므로 따옴표로 묶어 두었다가 생각났습니다. 내가 틀렸다고 생각해. 그리고 저는 OP에서 언급했듯이 timerID를 저장해야한다는 것을 알고 있습니다. 이것은 단지 작동하도록하기위한 테스트였습니다. heh. – RhoVisions