#jquery #jquery-select2 #jquery-select2-4
Вопрос:
Не могу найти здесь ничего или https://select2.org/
Можно ли с помощью select2 фильтровать результаты с помощью отдельных строк?
Пример:
Опции
- Марка телефона 128 ГБ Серебристый
- Марка телефона 256 ГБ Черный
- Марка телефона 256 ГБ Черный
- Марка телефона 128 ГБ Красный
- Марка телефона 256 ГБ Белого Цвета
Отфильтруйте по бренду телефона A и верните
- Марка телефона 128 ГБ Серебристый
- Марка телефона 256 ГБ Черный
- Марка телефона 256 ГБ Белого Цвета
Это не привело к каким-либо результатам, поскольку строка не соответствовала марке телефона 128 ГБ A.
Отредактировано: это не обязательно должно быть чувствительно к регистру.
Ответ №1:
Используйте функцию сопоставления и разделите строку поиска:
$(function() {
$(".select2").select2({
matcher: function (params, data) {
if ($.trim(params.term) === '') {
return data;
}
terms=(params.term).split(" ");
for (var i = 0; i < terms.length; i ) {
if (((data.text).toUpperCase()).indexOf((terms[i]).toUpperCase()) == -1)
return null;
}
return data;
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<select class='select2' style='width:250px'>
<option>Phone Brand 128GB A Silver</option>
<option>Phone Brand 256GB A Black</option>
<option>Phone Brand 256GB Black</option>
<option>Phone Brand 128GB Red</option>
<option>Phone Brand 256GB A White</option>
</select>
Если вы хотите, чтобы он учитывал регистр, просто удалите .toUpperCase()
$(function() {
$(".select2").select2({
matcher: function (params, data) {
if ($.trim(params.term) === '') {
return data;
}
terms=(params.term).split(" ");
for (var i = 0; i < terms.length; i ) {
if (((data.text)).indexOf((terms[i])) == -1)
return null;
}
return data;
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<select class='select2' style='width:250px'>
<option>Phone Brand 128GB A Silver</option>
<option>Phone Brand 256GB A Black</option>
<option>Phone Brand 256GB Black</option>
<option>Phone Brand 128GB Red</option>
<option>Phone Brand 256GB A White</option>
</select>
Редактировать:
Строгий поиск слов:
$(function() {
$(".select2").select2({
matcher: function (params, data) {
if ($.trim(params.term) === '') {
return data;
}
text=data.text.toUpperCase().split(" ");
terms=params.term.toUpperCase().split(" ").clean('');
count=terms.length;
terms.forEach(function(trm){
text.forEach(function(txt){
if (txt==trm)count--;
});
})
return !count?data:null;
}
});
});
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i ) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<select class='select2' style='width:250px'>
<option>Phone Brand 128GB A Silver</option>
<option>Phone Brand 256GB A Black</option>
<option>Phone Brand 256GB Black</option>
<option>Phone Brand 128GB Red</option>
<option>Phone Brand 256GB A White</option>
</select>
Комментарии:
1. Спасибо за ответ, ваш первый ответ не фильтруется ни по «Марке телефона А», ни по «марке телефона а». Тем не менее, ваш второй-с «Телефоном марки А», и это то, что я хочу, чтобы он делал, за исключением случаев, когда он не учитывает регистр. Вы очень близки, и я сначала не совсем понял, как использовать сопоставитель, так что это очень помогает.
2. Это потому, что при поиске «Марка телефона A» без учета регистра «A» совпадает с Br a nd и Bl a ck, если только вы не хотите, чтобы слово было очень строгим.
3. Отредактировано и добавлен строгий поиск слов. Вы можете выполнить поиск «Марка телефона A», «марка телефона a» или в беспорядке, например «Марка телефона». Но если вы поставите «Отруби» вместо «Бренд», никаких результатов не будет.
4. Я понял это после своего комментария. Все три являются хорошими примерами для использования в случае необходимости.