2011-12-20 6 views
2

모든그것은

에 JQuery와 자동 완성 플러그의 쓰기 _create 기능을 통해 할 수 있는가가 자동 완성 플러그의 쓰기 _create 기능을 통해 할 수 있습니까?

그렇다면 올바른 접근 방식은 무엇입니까? 문제의 난에 직면하기 때문에

나는 이상 함수를 만들 작성하려면 :

문제 :

1.UP 및 아래쪽 화살표 키 위쪽 및 아래쪽 화살표 아래의 경우

을 키,

자동 완성 플러그인에 event.preventDefault()가 있습니다. ,이 때문에 메뉴가 보이지 않아도 텍스트 영역 안의 캐럿 움직임을 방지 할 수 있습니다 ( ).

2 이스케이프 키 내 경우

, 나는
텍스트 영역에 텍스트를 취소했습니다 텍스트 영역에 입력하는 동안 나는 키를 탈출 누르면. 그러나 자동 완성 플러그는 이스케이프 키를 누른 경우 텍스트 영역에 입력 한 값을 다시 설정합니다.

안녕하세요, jquery 자동 완성 플러그인의 _create 기능을 작성하는 방법을 제안 해 주시겠습니까? 사전

답변

0

에서

덕분에 _create 기능을 덮어 쓰려면 :

$.ui.autocomplete.prototype._create = function() { 
    // new create function 
} 

대안은 단순히 jquery.ui.autocomplete.js의 소스 코드를 변경하는 것입니다 및 변경된 파일을 포함합니다.

+0

jquery.ui.autocomplete.js 파일을 직접 변경할 수있는 권한이 없습니다. 그것을하는 다른 방법이 있습니까? 그리고 제가 언급 한 문제는 무엇입니까? 그것을 해결하는 가장 좋은 방법은 무엇입니까 ?? – Cherry

0

글쎄, 제 의견으로는, 당신이 할 수있는 일이 많지 않습니다. 더러운 코딩.

변경을 제한 할 수있는 방법이 있습니다. 원래의 keydown 이벤트 핸들러를 플러그인에서 바인드 해제하고 수정 된 핸들러로 이벤트를 다시 바인드하는 것입니다 (당연히 원래 이벤트 핸들러를 기반으로 함).

$('#myinput').autocomplete({ ... }) 
    .unbind("keydown.autocomplete") 
    .bind("keydown.autocomplete", function(event) { 

     // obtain the plugin instance 
     var self = $(this).data('autocomplete'); 

     if (self.options.disabled || self.element.propAttr("readOnly")) { 
      return; 
     } 

     suppressKeyPress = false; 
     var keyCode = $.ui.keyCode; 
     switch (event.keyCode) { 
     case keyCode.PAGE_UP: 
      self._move("previousPage", event); 
      break; 
     case keyCode.PAGE_DOWN: 
      self._move("nextPage", event); 
      break; 
     case keyCode.UP: 
      self._move("previous", event); 

      // disable the prevent 
      // event.preventDefault(); 

      break; 
     case keyCode.DOWN: 
      self._move("next", event); 

      // disable the prevent 
      // event.preventDefault(); 

      break; 
     case keyCode.ENTER: 
     case keyCode.NUMPAD_ENTER: 
      // when menu is open and has focus 
      if (self.menu.active) { 
       // #6055 - Opera still allows the keypress to occur 
       // which causes forms to submit 
       suppressKeyPress = true; 
       event.preventDefault(); 
      } 
      //passthrough - ENTER and TAB both select the current element 
     case keyCode.TAB: 
      if (!self.menu.active) { 
       return; 
      } 
      self.menu.select(event); 
      break; 
     case keyCode.ESCAPE: 

      // clear the input value on ESC 
      self.element.val(''); 

      self.close(event); 
      break; 
     default: 
      // keypress is triggered before the input value is changed 
      clearTimeout(self.searching); 
      self.searching = setTimeout(function() { 
       // only search if the value has changed 
       if (self.term != self.element.val()) { 
        self.selectedItem = null; 
        self.search(null, event); 
       } 
      }, self.options.delay); 
      break; 
     } 
    }); 

:

그것은,이 작업을 수행 할 수있는 열쇠는 여기에 $(this).data('autocomplete');

와 JQuery와 데이터 등의 요소에 저장되어있는 플러그인 인스턴스를 얻을 수있는 코드가 매우 복잡하지 것입니다 것 설명 할 내용은 jsfiddle입니다.

+0

유용한 정보를 제공해 주셔서 감사합니다. 한가지 더 중요한 것은 자동 완성을 텍스트 영역에 추가 할 때입니다. IE에서 느립니다. 성능을 향상시킬 수있는 방법은 무엇입니까?미리 감사드립니다 – Cherry

+0

그냥 그런 식으로 나는 잘 몰라. 플러그인은 처음에는 텍스트 영역과 함께 사용되지 않았습니다. 아마 그것은 IE이기 때문일 수 있습니다. 언제 '천천히'(보여주는, 데이터를 ...)? –

+0

메뉴가 표시되어있는 경우 위 또는 아래 화살표를 눌러 메뉴의 이전 또는 다음 항목을 초점에 맞추면 호버 상태가 매우 천천히 움직입니다. – Cherry