5

Próbuję to zrobić http://jqueryui.com/autocomplete/#combobox Problem polega na tym, że po przejściu myszką nad opcją, opcje znikną i zasugeruje porady: "x nie pasuje do żadnej item "gdzie x to litery, które napisałem w comboboxie. Teraz mogę napisać skrypt, który jest na miejscu:Jquery ui combobox (autouzupełnianie) znika

(function($) { 
$.widget("ui.combobox", { 
    _create: function() { 
    var input, 
     that = this, 
     wasOpen = false, 
     select = this.element.hide(), 
     selected = select.children(":selected"), 
     value = selected.val() ? selected.text() : "", 
     wrapper = this.wrapper = $("<span>") 
     .addClass("ui-combobox") 
     .insertAfter(select); 

    function removeIfInvalid(element) { 
     var value = $(element).val(), 
     matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(value) + "$", "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 
     $(element) 
      .val("") 
      .attr("title", value + " didn't match any item") 
      .tooltip("open"); 
     select.val(""); 
     setTimeout(function() { 
      input.tooltip("close").attr("title", ""); 
     }, 2500); 
     input.data("ui-autocomplete").term = ""; 
     } 
    } 

    input = $("<input>") 
     .appendTo(wrapper) 
     .val(value) 
     .attr("title", "") 
     .addClass("ui-state-default ui-combobox-input") 
     .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; 
      that._trigger("selected", event, { 
      item: ui.item.option 
      }); 
     }, 
     change: function(event, ui) { 
      if (!ui.item) { 
      removeIfInvalid(this); 
      } 
     } 
     }) 
     .addClass("ui-widget ui-widget-content ui-corner-left"); 

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

    $("<a>") 
     .attr("tabIndex", -1) 
     .attr("title", "Show All Items") 
     .tooltip() 
     .appendTo(wrapper) 
     .button({ 
     icons: { 
      primary: "ui-icon-triangle-1-s" 
     }, 
     text: false 
     }) 
     .removeClass("ui-corner-all") 
     .addClass("ui-corner-right ui-combobox-toggle") 
     .mousedown(function() { 
     wasOpen = input.autocomplete("widget").is(":visible"); 
     }) 
     .click(function() { 
     input.focus(); 

     // close if already visible 
     if (wasOpen) { 
      return; 
     } 

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

    input.tooltip({ 
     tooltipClass: "ui-state-highlight" 
    }); 
    }, 

    _destroy: function() { 
    this.wrapper.remove(); 
    this.element.show(); 
    } 
}); 
    })(jQuery); 

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

i CSS:

.ui-combobox { 
position: relative; 
display: inline-block; 
} 
.ui-combobox-toggle { 
    position: absolute; 
    top: 0; 
    bottom: 0; 
    margin-left: -1px; 
    padding: 0; 
    /* support: IE7 */ 
    *height: 1.7em; 
    *top: 0.1em; 
} 
.ui-combobox-input { 
    margin: 0; 
    padding: 0.3em; 
} 

i mój select (pobudowane z JSP)

<select id="combobox"><option value="">Select one...</option> 
            <%for(int i=0;i<ut.size();i++){ 
            out.print("<option value=\""+ut.get(i).getIdUtente()+ 
              "\">"+ut.get(i).getNome()+" "+ut.get(i).getCognome()+" ("+ut.get(i).getIdUtente()+")"+"</option>"); 

            } 
             %> 

            </select> 

Teraz, gdzie jest mój problem? z góry dzięki!

Odpowiedz

13

Zdarzyło mi się również. Wygląda na to, że plik jQuery UI js został wywołany dwa razy. Usuń jedną i będzie działać

+0

+1 To było trudne do wymyślenia. Miałem linki do starej i nowej wersji jQuery UI. – nima

+0

hahaha dzięki moje było jeszcze trudniejsze. Jeden został wywołany normalnie w nagłówku, drugi został wywołany dynamicznie przez JavaScript: s. – bicycle

+1

Mam kopię przypadkowo wklejono ten kod, aby ten problem wystąpił. Trudno było zidentyfikować problem. Sugestia @ roweru zadziałała dla mnie –

3

To się stanie w powiązanym scenariuszu, w którym odwołasz się do podstawowej biblioteki jQuery (jquery-ui.js) i poszczególnych bibliotek do autouzupełniania jquery ui w tym samym czasie. Plik jQuery-ui zawiera wszystkie dzieci, więc nie ma potrzeby odwoływania się do nich.

+0

To rozwiązało mój problem. Szukałem duplikatów plików js, jak każdy sugeruje. Jak się okazuje, jquery-ui.js zawiera wszystkie pojedyncze pliki. – Yorro

+0

Dzięki, przyjacielu. To naprawiło to dla mnie. – devKoen1

Powiązane problemy