2012-03-12 64 views
2

我想在一個html頁面上有多個JQuery自動完成組合框的。 (如何)這是possibe?在一個頁面上的多個jQuery自動完成組合框的實例

我發現組合框的id事項。在下面的例子中,用JQuery顯示的唯一組合框是第一個。 我不喜歡複製(太多)JQuery腳本代碼(我把這段代碼放在.js文件中,並在.php文件中生成組合框)

我有這個(這只是示例代碼http://jqueryui.com/demos/autocomplete/#combobox

<select id="combobox"> 
    <option value="">Select one...</option> 
    <option value="ActionScript">ActionScript</option> 
    <option value="AppleScript">AppleScript</option> 
    <option value="Asp">Asp</option> 
    <option value="BASIC">BASIC</option> 
    <option value="C">C</option> 
    <option value="C++">C++</option> 
    <option value="Clojure">Clojure</option> 
    <option value="COBOL">COBOL</option> 
    <option value="ColdFusion">ColdFusion</option> 
    <option value="Erlang">Erlang</option> 
    <option value="Fortran">Fortran</option> 
    <option value="Groovy">Groovy</option> 
    <option value="Haskell">Haskell</option> 
    <option value="Java">Java</option> 
    <option value="JavaScript">JavaScript</option> 
    <option value="Lisp">Lisp</option> 
    <option value="Perl">Perl</option> 
    <option value="PHP">PHP</option> 
    <option value="Python">Python</option> 
    <option value="Ruby">Ruby</option> 
    <option value="Scala">Scala</option> 
    <option value="Scheme">Scheme</option> 
</select> 
<select id="combobox2"> 
    <option value="">Select one...</option> 
    <option value="ActionScript">ActionScript</option> 
    <option value="AppleScript">AppleScript</option> 
    <option value="Asp">Asp</option> 
    <option value="BASIC">BASIC</option> 
    <option value="C">C</option> 
    <option value="C++">C++</option> 
    <option value="Clojure">Clojure</option> 
    <option value="COBOL">COBOL</option> 
    <option value="ColdFusion">ColdFusion</option> 
    <option value="Erlang">Erlang</option> 
    <option value="Fortran">Fortran</option> 
    <option value="Groovy">Groovy</option> 
    <option value="Haskell">Haskell</option> 
    <option value="Java">Java</option> 
    <option value="JavaScript">JavaScript</option> 
    <option value="Lisp">Lisp</option> 
    <option value="Perl">Perl</option> 
    <option value="PHP">PHP</option> 
    <option value="Python">Python</option> 
    <option value="Ruby">Ruby</option> 
    <option value="Scala">Scala</option> 
    <option value="Scheme">Scheme</option> 
</select> 

(function($) { 
    $.widget("ui.combobox", { 
     _create: function() { 
      var self = this, 
       select = this.element.hide(), 
       selected = select.children(":selected"), 
       value = selected.val() ? selected.text() : ""; 
      var input = this.input = $("<input>") 
       .insertAfter(select) 
       .val(value) 
       .autocomplete({ 
        delay: 0, 
        minLength: 0, 
        source: function(request, response) { 
         var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i"); 
         response(select.children("option").map(function() { 
          var text = $(this).text(); 
          if (this.value && (!request.term || matcher.test(text))) 
           return { 
            label: text.replace(
             new RegExp(
              "(?![^&;]+;)(?!<[^<>]*)(" + 
              $.ui.autocomplete.escapeRegex(request.term) + 
              ")(?![^<>]*>)(?![^&;]+;)", "gi" 
             ), "<strong>$1</strong>"), 
            value: text, 
            option: this 
           }; 
         })); 
        }, 
        select: function(event, ui) { 
         ui.item.option.selected = true; 
         self._trigger("selected", event, { 
          item: ui.item.option 
         }); 
        }, 
        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; 
            return false; 
           } 
          }); 
          if (!valid) { 
           // remove invalid value, as it didn't match anything 
           $(this).val(""); 
           select.val(""); 
           input.data("autocomplete").term = ""; 
           return false; 
          } 
         } 
        } 
       }) 
       .addClass("ui-widget ui-widget-content ui-corner-left"); 

      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' class='ui-button ui-widget ui-state-default ui-button-icon-only ui-corner-right ui-button-icon ui-state-hover'><span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'></span><span class='ui-button-text'>&nbsp;</span></button>") 
       .attr("tabIndex", -1) 
       .attr("title", "Show All Items") 
       .attr("role", "button") 
       .attr("aria-disabled", "false") 
       .insertAfter(input) 
       .button({ 
        icons: { 
         primary: "ui-icon-triangle-1-s" 
        }, 
        text: false 
       }) 
       .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(); 
       }); 
     }, 

     destroy: function() { 
      this.input.remove(); 
      this.button.remove(); 
      this.element.show(); 
      $.Widget.prototype.destroy.call(this); 
     } 
    }); 
})(jQuery); 

$(function() { 
    $("#combobox").combobox(); 
    $("#toggle").click(function() { 
     $("#combobox").toggle(); 
    }); 
}); 

謝謝!

回答

6

假設所有你需要的是選擇目標元素,你只需要通過類或多個ID這樣的選擇:

$('.combobox').combobox(); // would need to add this shared class to markup 

// OR 
$('#combobox, #combobox2').combobox(); // should work with existing markup 

我更使用類,以便您隨着您的成長,並不總是必須手動添加更多的ID。

請注意,它們包含的切換按鈕就像演示顯示底層「真實」組合框一樣。我不認爲你需要綁定切換。

[小提琴在註釋中找到:]

http://jsfiddle.net/6wMz9/(使用ID)

http://jsfiddle.net/6wMz9/1/(4個組合框,使用類)

+0

嗨Greg 感謝您的快速回復! 我試過兩種選擇,但在這兩種情況下,只有第一個組合框變成了一個jQuery小部件... 我已經刪除了切換按鈕,因爲我確實不需要它... – user1264532 2012-03-13 09:05:23

+0

適用於我:http:// jsfiddle.net/6wMz9/(注意風格丟失,按鈕爲空......這是因爲jQuery UI CSS不存在,但你可以告訴它它工作) – 2012-03-13 14:19:54

+1

使用類而不是ID(注意除了HTML標記是必要的,他們都得到'class =「combobox」')http://jsfiddle.net/6wMz9/1/ – 2012-03-13 14:25:19

4

user1264532

我想要做相同的,我有多個組合框實例,但ID是問題所在,所以我所做的就是將相同的ID添加到由autocomplete.combobox示例創建的跨度中。唯一的變化是在構造函數中:

 _create: function() { 
     console.log(this); 
      this.wrapper = $("<span>") 
       .addClass("custom-combobox") 
       .insertAfter(this.element) 
       .attr('id', this.element[0].id+'_combobox'); 
      this.element.hide(); 
      this._createAutocomplete(); 
      this._createShowAllButton(); 
     }, 

而只是把它這樣

$("#combobox1").combobox(); 
    $("#combobox2").combobox(); 

我這樣做是因爲我需要趕上變化事件上的每個組合框,並在其他答案我無法實現這一點。希望這可以幫助。

這裏是一個jsFiddle example乾杯!

相關問題