2011-12-20 35 views
2

全部是否有可能超寫jQuery自動完成插件的_create函數

是否可以重寫自動完成插件的_create函數?

如果是這樣,那麼正確的方法是什麼?

我想通過寫創建功能,因爲的問題,我面對:

問題:

1.增和向下箭頭鍵

在向上和向下箭頭的情況下鍵,

自動完成插件有event.preventDefault(); ,因此,即使菜單不可見,它也會阻止文本區內的插入符號移動 。

2. Escape鍵

在我而言,如果我按下退出鍵,而在文本區域中鍵入我已經以清除
文本區域中。但是,如果按下 轉義鍵,自動完成插件將重置文本區域中鍵入的值。

SO, 你能否告訴我如何重寫jQuery自動完成插件的_create函數?

預先感謝

回答

0

要覆蓋_create功能:

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

另一種方法是簡單地改變的jquery.ui.autocomplete.js的源代碼幷包括被改變的文件。

+0

我沒有權限直接更改jquery.ui.autocomplete.js文件。還有其他的方式嗎?那麼我提到的問題是什麼,解決它們的最好方法是什麼? – Cherry 2011-12-20 13:44:54

0

好吧,在我看來,沒有太多的事可以做編碼。

雖然有一種方法可以限制更改。它是解綁定綁定在插件中的原始​​事件處理程序,並將事件與修改後的處理程序(當然基於原始程序)重新綁定。

這不是很複雜,要做到這一點,關鍵是要獲取保存在元素jQuery的數據與$(this).data('autocomplete');

此處插件實例的代碼:

$('#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; 
     } 
    }); 

這裏是一個jsfiddle來說明。

+0

感謝您的有用信息。還有一件事是當我將自動完成功能添加到textarea時,它在IE中速度很慢,我該如何改進它的性能?從你身邊的任何建議?在此先感謝 – Cherry 2011-12-21 11:53:25

+0

就像我不知道。插件並不打算與textareas一起使用。也許只是因爲它是IE。什麼時候「緩慢」(顯示,獲取數據......)? – 2011-12-21 12:15:56

+0

如果菜單是可見的,如果我們按向上或向下箭頭來聚焦菜單中的上一個或下一個項目,懸停狀態移動非常緩慢 – Cherry 2011-12-21 12:19:34