#jquery #autocomplete #jquery-ui-autocomplete
#jquery #автозаполнение #jquery-ui-автозаполнение
Вопрос:
Я использую плагин автозаполнения jQuery UI в своем веб-приложении. Я смог заставить это работать, но проблема в том, что всякий раз, когда я ввожу текстовое поле, отображаются все элементы из моего массива. Что я хочу сделать, так это то, что я ввожу в текстовое поле, я хочу получить все соответствующие элементы при вводе.
это мой код
var products= [
{"id":1,"value":"VITA.E D-ALPHA 400 UI X 30S","code":"00019","barcode":null,"case_cost":"168.00","pack_cost":"168.00","piece_cost":"5.60"},
{"id":2,"value":"NATTOKIN 1000MG SOFTGELX6S","code":"0005","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"},
{"id":3,"value":"LIVERMARIN PLUS 1000MGX6S","code":"0006","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"},
{"id":4,"value":"LIVERMARIN PLUS X30S","code":"00063","barcode":null,"case_cost":"528.00","pack_cost":"528.00","piece_cost":"17.60"},
{"id":5,"value":"NATTOKIN X 30S","code":"00065","barcode":null,"case_cost":"840.00","pack_cost":"840.00","piece_cost":"28.00"},
{"id":6,"value":"OMEGAMAX 12X30S","code":"00067","barcode":null,"case_cost":"5472.00","pack_cost":"456.00","piece_cost":"15.20"}
];
$('#product_code').autocomplete({
minLength:2,
source : function(req,res){
res($.map(products, function(item){
return{
id: item.id,
value : item.code,
label : item.value,
description : item.value,
case_cost : item.case_cost,
piece_cost : item.piece_cost,
pack_cost : item.pack_cost
}
}))
},
select : function(ev,ui){
//some codes here
},
}).focus(function() {
$(this).autocomplete("search", $(this).val());
});
Комментарии:
1. вы должны использовать запрос для фильтрации продуктов, соответствующих rq, из всех доступных продуктов
Ответ №1:
Фильтруйте массив в рамках обратного вызова источника, где используйте Array#filter
метод для фильтрации и String#includes
для проверки строки, содержащей условие поиска.
var products= [ {"id":1,"value":"VITA.E D-ALPHA 400 UI X 30S","code":"00019","barcode":null,"case_cost":"168.00","pack_cost":"168.00","piece_cost":"5.60"}, {"id":2,"value":"NATTOKIN 1000MG SOFTGELX6S","code":"0005","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"}, {"id":3,"value":"LIVERMARIN PLUS 1000MGX6S","code":"0006","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"}, {"id":4,"value":"LIVERMARIN PLUS X30S","code":"00063","barcode":null,"case_cost":"528.00","pack_cost":"528.00","piece_cost":"17.60"}, {"id":5,"value":"NATTOKIN X 30S","code":"00065","barcode":null,"case_cost":"840.00","pack_cost":"840.00","piece_cost":"28.00"}, {"id":6,"value":"OMEGAMAX 12X30S","code":"00067","barcode":null,"case_cost":"5472.00","pack_cost":"456.00","piece_cost":"15.20"} ];
$('#product_code').autocomplete({
minLength: 2,
source: function(req, res) {
res($.map(products.filter(o => o.value.toLowerCase().includes(req.term.toLowerCase())), function(item) {
return {
id: item.id,
value: item.code,
label: item.value,
description: item.value,
case_cost: item.case_cost,
piece_cost: item.piece_cost,
pack_cost: item.pack_cost
}
}))
},
select: function(ev, ui) {
//some codes here
},
}).focus(function() {
$(this).autocomplete("search", $(this).val());
});
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/jquery-ui-git.js"></script>
<input id="product_code">
С помощью ES6, разрушающего назначение и Array#map
метод.
var products= [ {"id":1,"value":"VITA.E D-ALPHA 400 UI X 30S","code":"00019","barcode":null,"case_cost":"168.00","pack_cost":"168.00","piece_cost":"5.60"}, {"id":2,"value":"NATTOKIN 1000MG SOFTGELX6S","code":"0005","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"}, {"id":3,"value":"LIVERMARIN PLUS 1000MGX6S","code":"0006","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"}, {"id":4,"value":"LIVERMARIN PLUS X30S","code":"00063","barcode":null,"case_cost":"528.00","pack_cost":"528.00","piece_cost":"17.60"}, {"id":5,"value":"NATTOKIN X 30S","code":"00065","barcode":null,"case_cost":"840.00","pack_cost":"840.00","piece_cost":"28.00"}, {"id":6,"value":"OMEGAMAX 12X30S","code":"00067","barcode":null,"case_cost":"5472.00","pack_cost":"456.00","piece_cost":"15.20"} ];
$('#product_code').autocomplete({
minLength: 2,
source: function(req, res) {
res(products.filter(o => o.value.toLowerCase().includes(req.term.toLowerCase()))
.map(({
id,
code,
value,
case_cost,
piece_cost,
pack_cost
}) => ({
id,
value: code,
label: value,
description: value,
case_cost,
piece_cost,
pack_cost
})))
},
select: function(ev, ui) {
//some codes here
},
}).focus(function() {
$(this).autocomplete("search", $(this).val());
});
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/jquery-ui-git.js"></script>
<input id="product_code">
Ответ №2:
Следуйте документации по автозаполнению пользовательского интерфейса jquery
var products= [
{"id":1,"value":"VITA.E D-ALPHA 400 UI X 30S","code":"00019","barcode":null,"case_cost":"168.00","pack_cost":"168.00","piece_cost":"5.60"},
{"id":2,"value":"NATTOKIN 1000MG SOFTGELX6S","code":"0005","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"},
{"id":3,"value":"LIVERMARIN PLUS 1000MGX6S","code":"0006","barcode":null,"case_cost":"0.00","pack_cost":"0.00","piece_cost":"0.00"},
{"id":4,"value":"LIVERMARIN PLUS X30S","code":"00063","barcode":null,"case_cost":"528.00","pack_cost":"528.00","piece_cost":"17.60"},
{"id":5,"value":"NATTOKIN X 30S","code":"00065","barcode":null,"case_cost":"840.00","pack_cost":"840.00","piece_cost":"28.00"},
{"id":6,"value":"OMEGAMAX 12X30S","code":"00067","barcode":null,"case_cost":"5472.00","pack_cost":"456.00","piece_cost":"15.20"}
];
Например, вы можете использовать статический источник и позволить jquery обрабатывать соответствие:
$('#product_code').autocomplete({
minLength:2,
source :$.map(products, function(item){
return{
value : item.code,
label : item.value
}
}),
select : function(ev,ui){
//some codes here
},
}).focus(function() {
$(this).autocomplete("search", $(this).val());
});
Или вы можете использовать более гибкий вызываемый в качестве источника:
$('#product_code').autocomplete({
minLength:2,
source : function(req,res){
var search = req.term.toLowerCase();
res(products.reduce(function(matches, product){
if ( -1 !== product.code.toLowerCase().indexOf(search) )
matches.push({value:product.code,label:product.value});
return matches;
}, []));
},
select : function(ev,ui){
//some codes here
},
}).focus(function() {
$(this).autocomplete("search", $(this).val());
});