2012-02-27 4 views
3

jQuery Autocomplete을 사용하고 있습니다. 편집이 가능해야합니다. 내 말은 값이 목록에 없으면 입력 한 값을 캡처해야한다는 것입니다. 위의 링크에서 예를 사용하여 사용자는 C#과 같은 선택 항목을 볼 수 없으며 언어를 입력합니다. 내가 기본 동작에서 발견 한 것은 값이 목록에 없으면 사용자 응답을 지우는 것입니다.jQuery 콤보 박스/자동 완성이지만 편집 가능

options: { 
    allowUserDefined: false 
}, 

var self = this, 
    **options = this.options,** 

if (!valid && !options.allowUserDefined) { 
    // remove invalid value, as it didn't match anything 
    $(this).val(""); 
    select.val(""); 
    input.data("autocomplete").term = ""; 
    return false; 
} 

이 해제되는 응답을 방지하기 위해 :

는 다음 코드를 추가했습니다. 그리고 이러한 몇 가지 변화가 효과적입니다. 그러나 C#이 목록에 없기 때문에 반환 할 옵션이 없습니다.

입력란에 입력 된 내용을 코드가 반환하도록하려면 어떻게해야합니까? change 이벤트에서 코드를 디버깅하는 동안 input.val()에는 입력 된 텍스트가 포함되어 있으며 필요한 것입니다. 이 값에 액세스하는 방법을 알 수 없습니다.

감사합니다.

Darkajax의 코드를 (내가 생각 해낸 것보다 더 엄격한 옵션을 좋아한다)를 사용하여, 나는의 값을 얻을 수 있습니다

(function ($) { 
    $.widget("ui.combobox", { 
     options: { 
      allowUserDefined: false 
     }, 
     _create: function() { 
      if (this.options.allowUserDefined === null) { 
       this.options.allowUserDefined = false; 
      } 

      var self = this, 
        options = this.options, 
        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 && !options.allowUserDefined) { 
            // 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'>&nbsp;</button>") 
        .attr("tabIndex", -1) 
        .attr("title", "Show All 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(); 
        }); 
     }, 

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

업데이트 : 여기

내 전체의 js 파일입니다 입력 상자에

var valu = $("#combobox").parent().children()[1].value; 
+0

좋은 (I 물론 잘못된 항목을 제거 코드를 제거) , 나는 적어도 조금 기여할 수있어서 기쁩니다! – DarkAjax

답변

5

jQuery UI 자동 완성 콤보 박스를 사용할 때 자신이하는 일은 콤보 박스를 선언하는 것입니다 이 같은 DGET :

이 유효 값으로 다른 옵션을 적용 할 것, 그리고 당신은 그냥 사용해야합니다
(function($) { 
    $.widget("ui.combobox", { 
     // default options 
     options: { 
      strict: false 
     }, 
     _create: function() { 
      var self = this, 
       select = this.element.hide(), 
       selected = select.children(":selected"), 
       value = selected.val() ? selected.text() : "", 
       strict = this.options.strict; 

      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 
         }); 
        }, 
        autocomplete : function(value) { 
         this.element.val(value); 
         this.input.val(value); 
        }, 
        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.value.match(matcher)) { 
            this.selected = valid = true; 
            return false; 
           } 
          }); 
          if (!valid) { 
           // if strict is true, then unmatched values are not allowed 
           if (strict) { 
            // remove invalid value, as it didn't match anything 
            $(this).val(""); 
            select.val(""); 
           } 
           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=combo_button>&nbsp;</button>") 
       .attr("tabIndex", -1) 
       .attr("title", "Show All 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; 
        } 

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

:

$("#combobox").combobox({ 
    strict: true 
}); 

를이 기본으로 작동하려면 단지 경우에 당신이 그것을 필요 . 당신이 request.term에 액세스 할 수 있습니다

source: function(request, response) 
{ 

에서

+0

응답 darkajax에 감사드립니다. 나는 여전히 값을 입력 할 수 없다. 그것은 단지 목록의 첫 번째 항목을 반환하는 것 같습니다. 나는 방법이 있어야한다는 것을 안다. – DrZ

+0

위의 나의 업데이트를 보아라. – DrZ

0

은 = 무엇을 입력했다. darkajax에서 청소기 솔루션, 그리고 다음 코드 줄을 사용

0

는 :

var valu = $("#combobox").parent().children()[1].value; 

나는 콤보 상자의 값을 얻을 수 있었다.

0

내가이 사람을 도움이 될 것입니다 경우 단서가 없지만, 입력의 이름을 제공하여, 값이 제출되었습니다 ....

var input = this.input = $("<input name='somehthing'>")