2012-07-17 98 views
1

我正在工作combox.ui,這是由我的一個高級更改之前。他根據我們項目的需要更改了js文件。但是現在我的需要是現在每當有人關注下拉列表時 - 選擇 - 應該從列表中刪除,自動完成搜索應該開始,並且每當焦點不在下拉或輸入時 - 選擇 - 應該被添加到它的位置。請告訴我我在哪裏做錯了,這個函數應該寫在哪裏。我不知道在哪裏寫這個函數在這個插件代碼..combobox.ui jquery啓動焦點自動完成

(function ($) { 
$.widget("ui.combobox", { 
    options: { 
     maxOptionSize: 20, 
     maxOptionText: "... type to filter" 
    }, 
    _create: function() { 
     var self = this, 
      select = this.element.hide(), 
      selected = select.children(":selected"), 
      maxOptionValue = select.children().eq(0).val(), 
      value = selected.val() ? selected.text() : ""; 

     select.wrap("<div style='float:left;'></div>"); 

     var width = $(select).width(); 
     if (width == 0) 
      width = 100; 

     if (this.element.attr('disabled') == 'disabled') {/*To handle disabled case */ 
      input = this.input = $("<input type='textbox'>").addClass("textbox").attr("disabled", "disabled").insertAfter(select).val(value).attr("title", value); 
      return; /*Do not render autocomplete*/ 
     } 
     var input = this.input = $("<input>").insertAfter(select).val(value).attr("title", value).autocomplete({ 
      delay: 0, 
      minLength: 0, 
      source: function (request, response) { 
       var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); 
       var select_el = select.get(0); // get dom element 
       var rep = new Array(); // response array 
       input.data("autocomplete").showMaxOption = false; 
       // simple loop for the options 
       for (var i = 0; i < select_el.length; i++) { 
        var text = select_el.options[i].text; 
        // add element to result array 
        if (select_el.options[i].value && (!request.term || matcher.test(text))) { 
         rep.push({ 
          label: text, //.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"), 
          value: text, 
          option: select_el.options[i], 
          number: i + 1 
         }); 
        } 
        if (rep.length == self.options.maxOptionSize) { 
         input.data("autocomplete").showMaxOption = true; 
         input.data("autocomplete").maxOptionText = self.options.maxOptionText; 
         break; 
        } 
       } 
       // send response 
       response(rep); 
      }, 
      select: function (event, ui) { 

       if (ui.item.value == maxOptionValue) { 
        input.data("autocomplete").term = ""; 
        var selValue = select.find("option:selected").text(); 
        $(this).val(selValue).attr("title", selValue); 

        return false; 
       } else { 
        ui.item.option.selected = true; 
        self._trigger("selected", event, { 
         item: ui.item.option 
        }); 
       } 
      }, 
      focus: function (event, ui) { 

       if (ui.item.value == maxOptionValue) { 
        return false; 
       } 
      }, 
      change: function (event, ui) { 

       if (!ui.item) { 
        var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val()) + "$", "i"), 
         valid = false; 
        select.children("option").each(function() { 
         if ($(this).text().match(matcher)) { 
          this.selected = valid = true; 
          select.change(); 
          return false; 
         } 
        }); 
        if (!valid) { 
         input.data("autocomplete").term = ""; 
         var selValue = select.find("option:selected").text(); 
         $(this).val(selValue).attr("title", selValue); 
         return false; 
        } 
       } else { 
        var selValue = select.find("option:selected").text(); 
        $(this).attr("title", selValue); 
       } 
      }, 
      close: function (event, ui) { 
       if (event.originalEvent && event.originalEvent.type === "menuselected") { 
        $(select).change(); 
       } 
      } 
     }).addClass("ui-widget ui-widget-content ui-corner-left").width(width); 

     input.data("autocomplete")._renderItem = function (ul, item) { 
      return $("<li></li>").data("item.autocomplete", item).append("<a>" + item.label + "</a>").appendTo(ul); 
     }; 

     this.button = $("<button type='button'>&nbsp;</button>").attr("tabIndex", -1).attr("title", "Show Items").insertAfter(input).button({ 
      icons: { 
       primary: "ui-icon-triangle-1-s" 
      }, 
      text: false 
     }).removeClass("ui-corner-all").addClass("ui-corner-right ui-button-icon").click(function() { 
      // close if already visible     
      if (input.autocomplete("widget").is(":visible")) { 
       input.autocomplete("close"); 
       return; 
      } 

      // work around a bug (likely same cause as #5265) 
      $(this).blur(); 

      // pass empty string as value to search for, displaying all results 
      input.autocomplete("search", ""); 
      input.focus(); 
     }); 

     var iw = input.outerWidth(true); 
     var bw = this.button.outerWidth(true); 
     select.parent().width(iw + bw + 1); 
    }, 
    destroy: function() { 
     this.input.remove(); 
     this.button.remove(); 
     this.element.show(); 
     $.Widget.prototype.destroy.call(this); 
    } 
}); 
})(jQuery); 
(function ($) { 
$.extend($.ui.autocomplete.prototype, { 
    _renderMenu: function (ul, items) { 
     var self = this; 
     $.each(items, function (index, item) { 
      if (index < items.length) 
       self._renderItem(ul, item); 
     }); 
     if (self.element.data("autocomplete").showMaxOption) { 
      ul.append("<li class='ui-autocomplete-max-option'>" +  self.element.data("autocomplete").maxOptionText + "</li>"); 
     } 
    } 
}); 
})(jQuery); 
+0

什麼是您的HTML是什麼樣子? – Jeemusu 2012-08-03 01:38:42

+0

HTML會有幫助! – JoeFletch 2012-08-03 12:21:23

+0

它正在頁面上的所有下拉菜單中實現...無論是使用''還是''... – 2012-08-06 06:52:46

回答

2

我覺得這是你問的是什麼, - 選擇 - 焦點被刪除,並加了回去模糊。

http://jsfiddle.net/nickaknudson/fsRn4/

UPDATE:焦點

顯示搜索,並增加 - 選擇 - 僅如果沒有選擇另一種選擇。

http://jsfiddle.net/nickaknudson/fsRn4/4/

資源:

+0

是的,我希望它像你一樣做...但intellisense /操作應刪除選擇文本後顯示...沒有點擊下拉按鈕...這是我的主要問題.. – 2012-08-08 04:21:40

+0

尼克,你的編輯工作...很酷... – 2012-08-10 04:31:06

2

剛剛輸入的聚焦狀態中添加$(input).autocomplete('search','');()事件,這將打開組合框每當輸入關注焦點。因此,基於尼克的小提琴,它會像input.focus(function(event) { $(this).val(''); $(input).autocomplete('search',''); });

這裏的工作示例:http://jsfiddle.net/fsRn4/3/

+0

Xnake,酷但仍然不完美...檢查你的小提琴它不工作,因爲它應該是...每當你從下拉菜單中選擇一個項目是橡木......但如果你單擊下拉列表外的文字再次改變選擇..這應該不會發生......否則,你幾乎成功了,並且出於我的想法,我處於相同的位置......但是+1爲你的努力... :) – 2012-08-08 07:42:24

+0

是有道理的,但沒有很好地解釋原始規格,更新我的答案,以遵守。感謝Xnake的幫助+1。 http://jsfiddle.net/nickaknudson/fsRn4/4/ – nickaknudson 2012-08-08 15:12:19

相關問題