2012-03-12 100 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干杯!

相关问题