2015-03-18 5 views
1

Как добавить дополнительную строку в результаты автозаполнения jQueryUI? Я реализовал Add additional link to jquery ui autocomplete list, как показано ниже, но он не отображает дополнительную строку, если автозаполнение не имеет совпадений.Добавить дополнительную строку в автозаполнение jqueryui (даже если автозаполнение не имеет совпадений)

То, что я пытался ...

Чтобы добавить дополнительный ряд к результатам jQueryUI автозаполнения, я придумал ниже сценарий. Дополнительная строка добавляется с помощью следующих:

open: function(event, ui) { 
    $('<li id="add-new">Add New</li>') 
    .on('click', function(event) {$("#dialog-add-new").dialog("open");}) 
    .appendTo('ul.ui-autocomplete'); 
} 

У меня есть три проблемы с реализацией:

  1. Если результаты не совпадают выделенный текст, не отображается новая строка. Введите «Вкл.» На входе, и вы увидите его. Введите «xx» во вход и не отобразится. Полагаю, я мог бы просто заполнить его сервером, но он кажется пустой тратой и скорее сделает это на стороне клиента.
  2. Возможно, проблемы, если у меня есть два ul.ui-autocomplete на странице?
  3. Добавленный ряд не имеет того же вида, что и строки автозаполнения.

Первый пункт является самым критичным. Как добавить дополнительную строку в результаты автозаполнения jQueryUI, даже если Autocomplete не имеет никаких результатов?

См. http://jsbin.com/quyexu/1/ для демонстрации в реальном времени нижеприведенного сценария. Вы можете игнорировать часть диалога, поскольку она работает. Спасибо

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
     <title>Testing</title> 
     <link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/themes/ui-lightness/jquery-ui.css" type="text/css" rel="stylesheet" /> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.js" type="text/javascript"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js" type="text/javascript"></script> 
     <style type="text/css"> 
     </style> 
     <script type="text/javascript"> 
      var source = [ 
       {value: "one",id: 1}, 
       {value: "two",id: 2}, 
       {value: "three",id: 3} 
      ]; 
      $(function(){ 
       $("#autocomplete").autocomplete({ 
        source: source, 
        minLength: 1, 
        focus: function(event, ui) {event.preventDefault();$(this).val(ui.item.label);}, 
        select: function(event, ui) { 
         console.log(ui) 
         $(this).val('');//.blur(); 
         event.preventDefault(); // cancel default behavior which updates input field 
         $("#my-list").append('<li data-id="'+ui.item.id+'">'+ui.item.value+'</li>'); 
        }, 
        open: function(event, ui) { 
         console.log(event,ui,this); 
         $('<li id="add-new">Add New</li>') 
         .on('click', function(event) {$("#dialog-add-new").dialog("open");}) 
         .appendTo('ul.ui-autocomplete'); 
        } 
       }); 

       $("#dialog-add-new").dialog({ 
        autoOpen: false,resizable: false,height: 200,width: 380, modal: true, 
        open  : function() {}, 
        buttons  : [ 
         { 
          text : 'ADD NEW', 
          "class" : 'green wide', 
          click : function() { 
           //Use Ajax to save value and get associated ID 
           var name=$('#new-name').val(); 
           var id=123; 
           $("#my-list").append('<li data-id="'+id+'">'+name+'</li>'); 
           $("#autocomplete").val('').focus(); 
           $(this).dialog("close"); 
          } 
         }, 
         { 
          text : 'CLOSE', 
          "class" : 'gray', 
          click : function() {$(this).dialog("close");} 
         } 
        ]  
       }); 
      }); 
     </script> 
    </head> 

    <body> 
     <input type="text" id="autocomplete" /> 
     <ul id="my-list"></ul> 
     <div id="dialog-add-new" class="dialog" title="Add New"> 
      <form> 
       <input type="text" name="new-name" id="new-name" /> 
      </form> 
     </div> 

    </body> 
</html> 
+0

Я просто попытался использовать событие 'response' вместо' open', но не успех. – user1032531

ответ

3

Чтобы добавить дополнительную строку, используйте событие ответа. http://api.jqueryui.com/1.10/autocomplete/#event-response

http://jsbin.com/wokuma/1/

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
     <title>Testing</title> 
     <link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/themes/ui-lightness/jquery-ui.css" type="text/css" rel="stylesheet" /> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.js" type="text/javascript"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js" type="text/javascript"></script> 
     <style type="text/css"> 
     </style> 
     <script type="text/javascript"> 
      var source = [ 
       {value: "one",id: 1}, 
       {value: "two",id: 2}, 
       {value: "three",id: 3} 
      ]; 
      $(function(){ 
       $("#autocomplete").autocomplete({ 
        source: source, 
        minLength: 1, 
        focus: function(event, ui) {event.preventDefault();$(this).val(ui.item.label);}, 
        select: function(event, ui) { 
         console.log(ui) 
         $(this).val('');//.blur(); 
         event.preventDefault(); // cancel default behavior which updates input field 
         if(ui.item.id===0){$("#dialog-add-new").dialog("open");} 
         else {$("#my-list").append('<li data-id="'+ui.item.id+'">'+ui.item.value+'</li>');} 
        }, 
        response: function(event, ui) { 
         console.log(event,ui,this); 
         ui.content.push({value:"Add New", id:0, label:"Add New"}); 
        } 
       }); 

       $("#dialog-add-new").dialog({ 
        autoOpen: false,resizable: false,height: 200,width: 380, modal: true, 
        open  : function() {}, 
        buttons  : [ 
         { 
          text : 'ADD NEW', 
          "class" : 'green wide', 
          click : function() { 
           //Use Ajax to save value and get associated ID 
           var name=$('#new-name').val(); 
           var id=123; 
           $("#my-list").append('<li data-id="'+id+'">'+name+'</li>'); 
           $("#autocomplete").val('').focus(); 
           $(this).dialog("close"); 
          } 
         }, 
         { 
          text : 'CLOSE', 
          "class" : 'gray', 
          click : function() {$(this).dialog("close");} 
         } 
        ]  
       }); 
      }); 
     </script> 
    </head> 

    <body> 
     <input type="text" id="autocomplete" /> 
     <ul id="my-list"></ul> 
     <div id="dialog-add-new" class="dialog" title="Add New"> 
      <form> 
       <input type="text" name="new-name" id="new-name" /> 
      </form> 
     </div> 

    </body> 
</html> 
+0

Отлично! Ты подтолкнул меня на это. Написал почти то же самое решение. – Johny

+0

Спасибо, Джонни, я был в тупике! Любые мысли, как я мог бы добавить добавленную строку? Могу ли я добавить к нему класс? Если нет, могу ли я использовать 'last-child' CSS (не затрагивая другие автозаполнения)? – user1032531

+0

Кроме того, мой подход, чтобы определить, следует ли добавить строку или открыть диалоговое окно, - это немного клочья. Мысли о лучшем пути? – user1032531

Смежные вопросы