260

Я пытаюсь найти рабочий пример элемента twitter bootstrap typeahead, который сделает вызов ajax для заполнения его выпадающего списка.twitter bootstrap typeahead Пример ajax

У меня есть существующий рабочий JQuery автозаполнения пример, который определяет Аякса URL к и как обрабатывать ответ

<script type="text/javascript"> 
//<![CDATA[ 
$(document).ready(function() { 
    var options = { minChars:3, max:20 }; 
    $("#runnerquery").autocomplete('./index/runnerfilter/format/html',options).result(
      function(event, data, formatted) 
       { 
        window.location = "./runner/index/id/"+data[1]; 
       } 
      ); 
     .. 

Что мне нужно изменить, чтобы преобразовать это в машинописный примере?

<script type="text/javascript"> 
//<![CDATA[ 
$(document).ready(function() { 
    var options = { source:'/index/runnerfilter/format/html', items:5 }; 
    $("#runnerquery").typeahead(options).result(
      function(event, data, formatted) 
       { 
        window.location = "./runner/index/id/"+data[1]; 
       } 
      ); 
     .. 

Я буду ждать «Add remote sources support for typeahead» вопрос будет решен.

+0

Чтобы быть более конкретным мне интересно, как варианты автозаполнения и результат обработки регулировочной с параметрами textahead? Есть ли набор определенных функций обработки результатов textalert, которые могут быть переопределены, или метод, названный унаследованным от базового jquery api. – emeraldjava

+1

Не могли бы вы пометить ответ Стейна Ван Баэля как правильный? Ответ bogert работает только для устаревших версий Bootstrap. –

ответ

287

Редактировать: typeahead больше не поставляется в Bootstrap 3. Выезд:

По Bootstrap 2.1.0 до 2.3.2, вы можете сделать это:

$('.typeahead').typeahead({ 
    source: function (query, process) { 
     return $.get('/typeahead', { query: query }, function (data) { 
      return process(data.options); 
     }); 
    } 
}); 

Чтобы использовать данные в формате JSON, как это:

{ 
    "options": [ 
     "Option 1", 
     "Option 2", 
     "Option 3", 
     "Option 4", 
     "Option 5" 
    ] 
} 

Обратите внимание, что данные JSON должны быть о f правильный тип mime (application/json), поэтому jQuery распознает его как JSON.

+0

Спасибо, что упомянули об этом. Я пытаюсь найти пример именно этого. Значит, данные, возвращаемые через $ .get, лучше быть JSON? – Houman

+3

Как и в вилке Typeahead, данные должны быть массивом строк JSON, а тип содержимого должен быть application/json. –

+9

может использовать json, который не просто массив строк? я должен так ценить пользователя и использовать id для дальнейшей обработки. Возможно ли это, если вы не подберете обычную вилку? – Anton

5

Я сделал некоторые изменения на Jquery-ui.min.js:

//Line 319 ORIG: 
this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(... 
// NEW: 
this.menu=d("<ul></ul>").addClass("ui-autocomplete").addClass("typeahead").addClass("dropdown-menu").appendTo(d(... 

// Line 328 ORIG: 
this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr... 
// NEW:this.element.attr.... 

// Line 329 ORIG: 
this.active=a.eq(0).children("a") 
this.active.children("a") 
// NEW: 
this.active=a.eq(0).addClass("active").children("a") 
this.active.removeClass("active").children("a")` 

и добавить следующие CSS

.dropdown-menu { 
    max-width: 920px; 
} 
.ui-menu-item { 
    cursor: pointer;   
} 

Работает идеально.

+0

, какую версию jquery ui min вы используете? – emeraldjava

+0

Если вам это нужно для jQuery 1.7.1 и jQuery UI 1.8.16, то я создал GIST на основе вышеупомянутого исправления, в котором показано, где можно изменить файл пользовательского интерфейса jQuery. https://gist.github.com/1884819 - строки комментируются // измененными –

+0

jQuery v1.7.1 и jQuery UI 1.8.13 - приветствия – bmoers

0

У меня нет рабочего примера для вас, и у меня нет очень чистого решения, но позвольте мне рассказать вам, что я нашел.

Если вы посмотрите на яваскрипт кода для машинописного это выглядит следующим образом:

items = $.grep(this.source, function (item) { 
    if (that.matcher(item)) return item 
    }) 

Этот код использует «Grep» метод JQuery, чтобы соответствовать элементу в исходном массиве. Я не видел никаких мест, где вы могли бы подключиться к вызову AJAX, поэтому для этого нет «чистого» решения.

Однако, несколько хакерский способ, которым вы можете это сделать, - воспользоваться тем, как работает метод grep в jQuery. Первый аргумент grep - это исходный массив, а второй аргумент - это функция, которая используется для сопоставления исходного массива (обратите внимание, что Bootstrap вызывает «совпадение», которое вы предоставили при его инициализации). То, что вы могли бы сделать, - установить источник в макетный одноэлементный массив и определить его как функцию с вызовом AJAX. Таким образом, он будет запускать вызов AJAX только один раз (поскольку ваш исходный массив имеет только один элемент).

Это решение не только взломанно, но и будет страдать от проблем с производительностью, поскольку код TypeAhead предназначен для поиска при каждом нажатии клавиши (вызовы AJAX должны выполняться только на каждые несколько нажатий клавиш или после определенного количества простоя время). Мой совет - попробовать, но придерживайтесь либо другой библиотеки автозаполнения, либо используйте это для ситуаций, отличных от AJAX, если у вас возникнут какие-либо проблемы.

116

Вы можете использовать BS Typeahead fork, который поддерживает вызовы ajax. Тогда вы сможете написать:

$('.typeahead').typeahead({ 
    source: function (typeahead, query) { 
     return $.get('/typeahead', { query: query }, function (data) { 
      return typeahead.process(data); 
     }); 
    } 
}); 
+1

спасибо ... много помогли ... приятно и просто ... – garmoncheg

+1

«Интеллектуальная догадка» jQuery для возвращаемого типа данных POST не работала, когда я возвращался, например, «[» aardvark »,« apple »]'. Я должен был явно указать параметр 'dataType' в вызове' $ .post'. См. [JQuery.post()] (http://api.jquery.com/jQuery.post/). –

+1

@rfausak В качестве альтернативы, установите заголовок 'Content-type' в' application/json' –

24

Я дополненной оригинальный машинописный Bootstrap плагин с АЯКС возможностями. Очень проста в использовании:

$("#ajax-typeahead").typeahead({ 
    ajax: "/path/to/source" 
}); 

Вот GitHub репо: Ajax-Typeahead

+0

. Я посмотрел код Gudbergur; честно говоря, мне понравилось это лучше всего. Это немного более дружелюбно и предлагает больше функциональности. Хорошая работа Пол! Единственное, что я хотел бы предложить, - это в вашем README напомнить пользователю, что им нужно разобрать свои JSON-данные в JS, чтобы ваш код мог правильно его использовать. Я предположил, что вы разбираете его для меня, так что меня немного повесили. В противном случае, довольно приятно, спасибо! :) – Bane

+3

Ваш сервер возвращает строку вместо объекта JSON. Для выполнения вызова используется $ .ajax() jQuery, и он заботится о разборе. –

+1

абсолютно правильно, спасибо за улов! :) Этот плагин работает очень хорошо. – Bane

1

UPDATE: Я изменил мой код, используя this вилку

также вместо $ .each я изменил $.Карта, как предложено Томислав Марковский

$('#manufacturer').typeahead({ 
    source: function(typeahead, query){ 
     $.ajax({ 
      url: window.location.origin+"/bows/get_manufacturers.json", 
      type: "POST", 
      data: "", 
      dataType: "JSON", 
      async: false, 
      success: function(results){ 
       var manufacturers = new Array; 
       $.map(results.data.manufacturers, function(data, item){ 
        var group; 
        group = { 
         manufacturer_id: data.Manufacturer.id, 
         manufacturer: data.Manufacturer.manufacturer 
        }; 
        manufacturers.push(group); 
       }); 
       typeahead.process(manufacturers); 
      } 
     }); 
    }, 
    property: 'name', 
    items:11, 
    onselect: function (obj) { 

    } 
}); 

Однако я сталкиваюсь с некоторыми проблемами при получении

Uncaught TypeError: Cannot call method 'toLowerCase' of undefined

, как вы можете видеть на новой должности я пытаюсь выяснить here

надеюсь, что это обновление окажет вам любую помощь ...

+0

Несвязанный с OP: я бы использовал 'Array.map' вместо' $ .each' и заменил содержимое вашей всей функции обратного вызова 'success' на' var manufacturer = results.data.manufacturers.map (function (item) {return { ID: item.Manufacturer.id, производитель: item.Manufacturer.производитель }}); ' –

+0

спасибо @TomislavMarkovski Я изменил свой код, как вы предлагаете. – mmoscosa

69

Начиная с Bootstrap 2.1.0:

HTML:

<input type='text' class='ajax-typeahead' data-link='your-json-link' /> 

Javascript:

$('.ajax-typeahead').typeahead({ 
    source: function(query, process) { 
     return $.ajax({ 
      url: $(this)[0].$element[0].dataset.link, 
      type: 'get', 
      data: {query: query}, 
      dataType: 'json', 
      success: function(json) { 
       return typeof json.options == 'undefined' ? false : process(json.options); 
      } 
     }); 
    } 
}); 

Теперь вы можете сделать единый код, помещая "JSON-запрос" ссылки в HTML-код.

+8

Это нужно отметить как новый принятый ответ. –

+11

Но я бы изменил его на использование '$ (this) [0]. $ Element.data ('link')'. –

+0

или 'this. $ Element.data ('link')' – Richard87

2

С помощью Bootstrap можно совершать звонки. В текущей версии отсутствуют какие-либо проблемы с обновлением исходного кода. Trouble updating Bootstrap's typeahead data-source with post response , то есть источник перезагрузки после обновления может быть снова изменен.

Пожалуйста, обратитесь к ниже для примера:

jQuery('#help').typeahead({ 
    source : function(query, process) { 
     jQuery.ajax({ 
      url : "urltobefetched", 
      type : 'GET', 
      data : { 
       "query" : query 
      }, 
      dataType : 'json', 
      success : function(json) { 
       process(json); 
      } 
     }); 
    }, 
    minLength : 1, 
}); 
0

при использовании Ajax, попробуйте $.getJSON() вместо $.get() если у вас есть проблемы с корректным отображением результатов.

В моем случае у меня был только первый символ каждого результата, когда я использовал $.get(), хотя я использовал сервер json_encode().

2

Для тех, кто ищет версию CoffeeScript принятого ответа:

$(".typeahead").typeahead source: (query, process) -> 
    $.get "/typeahead", 
    query: query 
    , (data) -> 
    process data.options 
2

Я прошел через этот пост и все не хотело работать правильно и в конечном итоге образует биты вместе с несколько ответов, так что я есть 100 % и вставьте его сюда для справки - вставьте это в файл php и убедитесь, что все включено в нужное место.

<?php if (isset($_GET['typeahead'])){ 
    die(json_encode(array('options' => array('like','spike','dike','ikelalcdass')))); 
} 
?> 
<link href="bootstrap.css" rel="stylesheet"> 
<input type="text" class='typeahead'> 
<script src="jquery-1.10.2.js"></script> 
<script src="bootstrap.min.js"></script> 
<script> 
$('.typeahead').typeahead({ 
    source: function (query, process) { 
     return $.get('index.php?typeahead', { query: query }, function (data) { 
      return process(JSON.parse(data).options); 
     }); 
    } 
}); 
</script> 
2

Я использую этот метод

$('.typeahead').typeahead({ 
    hint: true, 
    highlight: true, 
    minLength: 1 
}, 
    { 
    name: 'options', 
    displayKey: 'value', 
    source: function (query, process) { 
     return $.get('/weather/searchCity/?q=%QUERY', { query: query }, function (data) { 
      var matches = []; 
      $.each(data, function(i, str) { 
       matches.push({ value: str }); 
      }); 
      return process(matches); 

     },'json'); 
    } 
}); 
+0

Было бы неплохо, если бы вы могли добавить какое-то объяснение в свой ответ. Например, в чем разница вашего решения по сравнению с решениями, представленными в уже существующих ответах? – honk

37

Всех ответов сослаться на Bootstrap 2 машинописных, который больше не присутствует в Bootstrap 3.

Для тех, кто еще режиссера здесь ищет Пример AJAX с использованием нового post-Bootstrap Twitter typeahead.js, вот рабочий пример. Синтаксис немного отличается:

$('#mytextquery').typeahead({ 
    hint: true, 
    highlight: true, 
    minLength: 1 
}, 
{ 
    limit: 12, 
    async: true, 
    source: function (query, processSync, processAsync) { 
    processSync(['This suggestion appears immediately', 'This one too']); 
    return $.ajax({ 
     url: "/ajax/myfilter.php", 
     type: 'GET', 
     data: {query: query}, 
     dataType: 'json', 
     success: function (json) { 
     // in this example, json is simply an array of strings 
     return processAsync(json); 
     } 
    }); 
    } 
}); 

В этом примере используется как синхронный (вызов processSync) и асинхронное предложение, так что вы увидите некоторые опции появляются сразу, то другие будут добавлены. Вы можете просто использовать один или другой.

Существует множество связанных событий и некоторых очень мощных параметров, в том числе работа с объектами, а не с строками, и в этом случае вы будете использовать свой собственный дисплей, чтобы отображать ваши объекты в виде текста.

+0

Спасибо. Еще один вопрос: с processAsync я получаю «TypeError: ideas.slice не является функцией». Каким должен был бы быть возвращенный JSON? Вот мое лучшее предположение: {: предложения => ["Thing 1", "Thing 2", "Thing 3"]} – user1515295

+1

Убедитесь, что вы вернули действительную строку JSON. Функция предложения AJAX должна возвращать массив строк, например. '[" Thing 1 "," Thing 2 "]' или с пользовательской функцией отображения, массив объектов в соответствии с вашими потребностями, например. '[{" id ": 1," label ":" Foo "}, {" id ": 2," label ":" Bar "}]' –

+0

Я возвращаю '[{" id ": 1," label ":" Foo "}, {" id ": 2," label ":" Bar "}]', Теперь я хочу показать два столбца в раскрывающемся списке typeahead с идентификатором и меткой. Как я могу это сделать? – Vishal

1

Попробуйте это, если ваша служба не возвращает правильный тип приложения/содержание JSON заголовок:

$('.typeahead').typeahead({ 
    source: function (query, process) { 
     return $.get('/typeahead', { query: query }, function (data) { 
      var json = JSON.parse(data); // string to json 
      return process(json.options); 
     }); 
    } 
}); 
-1
$('#ingredient_name').typeahead({ 
     source: function (query, result) { 
      $.ajax({ 
       url: "db.php", 
       data: 'query=' + query,    
       dataType: "json", 
       type: "POST", 
       success: function (data) { 
        result($.map(data, function (item) { 
         return item; 
        })); 
       } 
      }); 
     }, 
     updater: function (item) { 
     //selectedState = map[item].stateCode; 

     // Here u can obtain the selected suggestion from the list 


     alert(item); 
      } 

    }); 

//Db.php file 
<?php  
$keyword = strval($_POST['query']); 
$search_param = "{$keyword}%"; 
$conn =new mysqli('localhost', 'root', '' , 'TableName'); 

$sql = $conn->prepare("SELECT * FROM TableName WHERE name LIKE ?"); 
$sql->bind_param("s",$search_param);    
$sql->execute(); 
$result = $sql->get_result(); 
if ($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
    $Resut[] = $row["name"]; 
    } 
    echo json_encode($Result); 
} 
$conn->close(); 

>