Плагин Jquery Chosen - динамически заполняемый список Ajax
Я пытаюсь создать свое выпадающее меню с помощью плагина "Выбранный" для "Множественный выбор" .
Здесь к поведению я основываюсь на:
http://jsfiddle.net/JfLvA/
Таким образом, вместо 3-х закодированных <option> в моем выборе. Я хочу, чтобы этот список был значением массива json, заполненным ajax-запросом. Это будет вызвано автозаполнением.
Итак, если пользователь набирает "автомобиль" , im отправляет письмо через ajax-вызов, а im возвращает такой массив:
[{ "ID" : "2489", "имя": "Carrie" }, { "ID" : "2490", "имя": "Каролина" }, { "ID" : "2491", "имя": "Кароль" }]
Код:
$(function() {
$(".chzn-select").chosen();
$(".chzn-select-deselect").chosen({allow_single_deselect:true});
$('.chzn-choices input').autocomplete({
source: function( request, response ) {
$.ajax({
url: "/change/name/autocomplete/"+request.term+"/",
dataType: "json",
success: function( data ) {
response( $.map( data, function( item ) {
$('ul.chzn-results').append('<li class="active-result">' + item.name + '</li>');
}
});
}
});
Результат:
Я печатаю "автомобиль" , в раскрывающемся списке Im получается "Нет результата для автомобиля", а затем у меня есть все мои результаты, как я хочу.
1. Почему я получаю сообщение "Нет результата", потому что я вижу в своем json-массиве и внутри своего списка, что получаю результаты.
-----------------------------
Когда я удаляю "автомобиль" и вводим "sam". Результаты для "sam" отображаются после результатов "автомобиля". (В принципе, я вижу результат для обоих, вместо того, чтобы просто получить результат моего текущего поиска)
2. Im, я полагаю, чтобы очистить ul от keyUp?? Думал, что плагин уже сделал это
-----------------------------
Когда я нажимаю на имя, чтобы на самом деле выбрать его и добавить в него, я получаю ошибку javascript внутри файла selected.js
элемент undefined
"item.selected = true;" строка 732
ссылка на плагин:
http://harvesthq.github.com/chosen/chosen/chosen.jquery.js
и не добавляет ничего внутри выбора.
3. Не знаю, почему это происходит.
-----------------------------
У вас, ребята, есть идея, что я делаю что-то неправильно? Я полностью застрял здесь...!
О, и кстати, я не возражаю изменить источник плагина, так как это единственное место, где я его использую....
Ответы
Ответ 1
попробуйте следующее:
$('.chzn-choices input').autocomplete({
source: function( request, response ) {
$.ajax({
url: "/change/name/autocomplete/"+request.term+"/",
dataType: "json",
beforeSend: function(){$('ul.chzn-results').empty();},
success: function( data ) {
response( $.map( data, function( item ) {
$('ul.chzn-results').append('<li class="active-result">' + item.name + '</li>');
}));
}
});
}
});
Ответ 2
Вы можете динамически заполнять список с помощью AJAX, используя отличный плагин Select2. Из моего ответа на вопрос "Есть ли способ динамически добавлять элементы AJAX через JQuery выбранный плагин?" :
Взгляните на аккуратный плагин Select2, который основан на самом Chosen и поддерживает удаленные источники данных (или данные AJAX) и бесконечную прокрутку.
Ответ 3
Ответ Асирвада больше не работает. Обратите внимание, что имя класса изменяется и используется вариант, а не элемент li. Я обновил свой ответ, чтобы не использовать устаревшее событие "success", вместо этого предпочитая использовать .done():
$('.chosen-search input').autocomplete({
minLength: 3,
source: function( request, response ) {
$.ajax({
url: "/some/autocomplete/url/"+request.term,
dataType: "json",
beforeSend: function(){ $('ul.chosen-results').empty(); $("#CHOSEN_INPUT_FIELDID").empty(); }
}).done(function( data ) {
response( $.map( data, function( item ) {
$('#CHOSEN_INPUT_FIELDID').append('<option value="blah">' + item.name + '</option>');
}));
$("#CHOSEN_INPUT_FIELDID").trigger("chosen:updated");
});
}
});
Ответ 4
Это может быть полезно. Вы должны просто вызвать событие.
$("#DropDownID").trigger("liszt:updated");
Где "DropDownID" - это идентификатор <select>
.
Более подробная информация здесь: http://harvesthq.github.com/chosen/
Ответ 5
Выбранный плагин не обновляет свой список опций автоматически при изменении элементов OPTION в DOM. Вы должны отправить ему событие для запуска обновления:
Pre Chosen 1.0: $('.chzn-select').trigger("liszt:updated");
Выбрано 1.0 $('.chosen-select').trigger("chosen:updated");
Если вы динамически управляете элементами OPTION, вам придется делать это каждый раз, когда изменяются ВАРИАНТЫ. То, как вы это сделаете, будет отличаться - в AngularJS попробуйте что-то вроде этого:
$scope.$watch(
function() {
return element.find('option').map(function() { return this.value }).get().join();
},
function() {
element.trigger('liszt:updated');
}
}
Ответ 6
Выбранный ответ устарел, то же самое относится к платиновому/ajax-выбранному плагину.
В модуле Select2 появилось много ошибок, которые я не могу решить.
Вот мой ответ на этот вопрос.
Я включил свое решение с помощью триггера функции после пользовательского типа.
Благодаря этому ответу: fooobar.com/questions/18719/....
//setup before functions
var typingTimer; //timer identifier
var doneTypingInterval = 2000; //time in ms (2 seconds)
var selectID = 'YourSelectId'; //Hold select id
var selectData = []; // data for unique id array
//on keyup, start the countdown
$('#' + selectID + '_chosen .chosen-choices input').keyup(function(){
// Change No Result Match text to Searching.
$('#' + selectID + '_chosen .no-results').html('Searching = "'+ $('#' + selectID + '_chosen .chosen-choices input').val() + '"');
clearTimeout(typingTimer); //Refresh Timer on keyup
if ($('#' + selectID + '_chosen .chosen-choices input').val()) {
typingTimer = setTimeout(doneTyping, doneTypingInterval); //Set timer back if got value on input
}
});
//user is "finished typing," do something
function doneTyping () {
var inputData = $('#' + selectID + '_chosen .chosen-choices input').val(); //get input data
$.ajax({
url: "YourUrl",
data: {data: inputData},
type:'POST',
dataType: "json",
beforeSend: function(){
// Change No Result Match to Getting Data beforesend
$('#' + selectID + '_chosen .no-results').html('Getting Data = "'+$('#' + selectID + '_chosen .chosen-choices input').val()+'"');
},
success: function( data ) {
// iterate data before append
$.map( data, function( item ) {
// matching data eg: by id or something unique; if data match: <option> not append - else: append <option>
// This will prevent from select the same thing twice.
if($.inArray(item.attr_hash,selectData) == -1){
// if not match then append in select
$('#' + selectID ).append('<option id="'+item.id+'" data-id = "'+item.id+'">' + item.data + '</option>');
}
});
// Update chosen again after append <option>
$('#' + selectID ).trigger("chosen:updated");
}
});
}
// Chosen event listen on input change eg: after select data / deselect this function will be trigger
$('#' + selectID ).on('change', function() {
// get select jquery object
var domArray = $('#' + selectID ).find('option:selected');
// empty array data
selectData = [];
for (var i = 0, length = domArray.length; i < length; i++ ){
// Push unique data to array (for matching purpose)
selectData.push( $(domArray[i]).data('id') );
}
// Replace select <option> to only selected option
$('#' + selectID ).html(domArray);
// Update chosen again after replace selected <option>
$('#' + selectID ).trigger("chosen:updated");
});
Ответ 7
Как и Vicky, Select2 поставляется с встроенными функциями AJAX и выглядит как отличный плагин.
Если вы не хотите переключаться с Chosen, попробуйте AJAX-Chosen https://github.com/meltingice/ajax-chosen
Ответ 8
Выбранный API сильно изменился.
Если вы не указали данное решение, вы можете попробовать следующее: https://github.com/goFrendiAsgard/gofrendi.chosen.ajaxify
Вот функция:
// USAGE:
// $('#some_input_id').chosen();
// chosen_ajaxify('some_input_id', 'http://some_url.com/contain/');
// REQUEST WILL BE SENT TO THIS URL: http://some_url.com/contain/some_term
// AND THE EXPECTED RESULT (WHICH IS GOING TO BE POPULATED IN CHOSEN) IS IN JSON FORMAT
// CONTAINING AN ARRAY WHICH EACH ELEMENT HAS "value" AND "caption" KEY. EX:
// [{"value":"1", "caption":"Go Frendi Gunawan"}, {"value":"2", "caption":"Kira Yamato"}]
function chosen_ajaxify(id, ajax_url){
console.log($('.chosen-search input').autocomplete);
$('div#' + id + '_chosen .chosen-search input').keyup(function(){
var keyword = $(this).val();
var keyword_pattern = new RegExp(keyword, 'gi');
$('div#' + id + '_chosen ul.chosen-results').empty();
$("#"+id).empty();
$.ajax({
url: ajax_url + keyword,
dataType: "json",
success: function(response){
// map, just as in functional programming :). Other way to say "foreach"
$.map(response, function(item){
$('#'+id).append('<option value="' + item.value + '">' + item.caption + '</option>');
});
$("#"+id).trigger("chosen:updated");
$('div#' + id + '_chosen').removeClass('chosen-container-single-nosearch');
$('div#' + id + '_chosen .chosen-search input').val(keyword);
$('div#' + id + '_chosen .chosen-search input').removeAttr('readonly');
$('div#' + id + '_chosen .chosen-search input').focus();
// put that underscores
$('div#' + id + '_chosen .active-result').each(function(){
var html = $(this).html();
$(this).html(html.replace(keyword_pattern, function(matched){
return '<em>' + matched + '</em>';
}));
});
}
});
});
}
Вот ваш HTML:
<select id="ajax_select"></select>
И вот ваш javasscript:
// This is also how you usually use chosen
$('#ajax_select').chosen({allow_single_deselect:true, width:"200px", search_contains: true});
// And this one is how you add AJAX capability
chosen_ajaxify('ajax_select', 'server.php?keyword=');
Для получения дополнительной информации см. https://github.com/goFrendiAsgard/gofrendi.chosen.ajaxify#how-to-use
Ответ 9
Если у вас есть два или более выбора и используйте ответ Стив МакЛенитан, попробуйте заменить первую строку:
$('#CHOSENINPUTFIELDID_chosen > div > div input').autocomplete({
не удалять суффикс: _chosen
Ответ 10
var object = $("#lstValue_chosen").find('.chosen-choices').find('input[type="text"]')[0];
var _KeyCode = event.which || event.keyCode;
if (_KeyCode != 37 && _KeyCode != 38 && _KeyCode != 39 && _KeyCode != 40) {
if (object.value != "") {
var SelectedObjvalue = object.value;
if (SelectedObjvalue.length > 0) {
var obj = { value: SelectedObjvalue };
var SelectedListValue = $('#lstValue').val();
var Uniqueid = $('#uniqueid').val();
$.ajax({
url: '/Admin/GetUserListBox?SelectedValue=' + SelectedListValue + '&Uniqueid=' + Uniqueid,
data: { value: SelectedObjvalue },
type: 'GET',
async: false,
success: function (response) {
if (response.length > 0) {
$('#lstValue').html('');
var options = '';
$.each(response, function (i, obj) {
options += '<option value="' + obj.Value + '">' + obj.Text + '</option>';
});
$('#lstValue').append(options);
$('#lstValue').val(SelectedListValue);
$('#lstValue').trigger("chosen:updated");
object.value = SelectedObjvalue;
}
},
error: function (xhr, ajaxOptions, thrownError) {
//jAlert("Error. Please, check the data.", " Deactivate User");
alert(error.StatusText);
}
});
}
}
}
Ответ 11
Если вы генерируете select tag из ajax, добавьте в функцию успеха:
$('.chosen').chosen();
Или, если вы генерируете select tag при нажатии кнопки add more, то добавьте:
$('.chosen').chosen();
внутри функции.