简体   繁体   English

为复选框元素JavaScript创建动态搜索栏

[英]Create a Dynamic search bar for checkboxes elements JavaScript

I'm trying to make a search bar which shows elements based on their text according to what you enter in a search bar. 我正在尝试制作一个搜索栏,根据您在搜索栏中输入的内容根据其文本显示元素。 But most instructions online are about arrays or lists and I can't adapt my code to include those. 但是大多数在线说明都是关于数组或列表的,我无法修改我的代码以包含这些内容。

I have a succession of checkboxes created according to an array and I don't know how to proceed. 我有一系列根据数组创建的复选框,但我不知道该如何进行。

I whould like something like if I write "J" in the search bar, I would see the checkboxes "January" "June" "July". 我想在搜索栏中输入“ J”,我会看到“一月”,“六月”,“七月”复选框。

Here is a snippet to help you to understand. 这是一个片段,可以帮助您理解。 I would prefer Javascript instead of jQuery. 我更喜欢Javascript而不是jQuery。

 //array of options (change this array and you change the checkboxes) var choices = new Array(); choices[0] = "January"; choices[1] = "February"; choices[2] = "March"; choices[3] = "April"; choices[4] = "May"; choices[5] = "June"; choices[6] = "July"; choices[7] = "August"; choices[8] = "September"; choices[9] = "October"; choices[10] = "November"; choices[11] = "December"; //array of value which have to be automaticly selected var target = new Array() target[0] = "9"; target[1] = "8"; target[2] = "11"; var cbh = document.getElementById('checkboxes'); var val = ''; var cap = ""; var j = ""; var t = document.getElementById('t'); // the loop is creating the checkboxes with name, value... for (var i in choices) { //Name of checkboxes are their number so I convert the i into a string. j = i.toString(); val = j; //cap will be the value/text of choices[i] var cb = document.createElement('input'); var label = document.createElement("label"); cap = choices[i]; var text = document.createTextNode(cap); cb.type = 'checkbox'; cbh.appendChild(cb); cb.name = cap; cb.value = val; label.appendChild(cb); label.appendChild(text); cbh.appendChild(label); cb.addEventListener('click', updateText) if(target.indexOf(i)>=0){ cb.checked =true ; } } //function which update the text area according to which checkbox is selected or not updateText(); function updateText() { t.value = [null, ...document.querySelectorAll('#checkboxes [type="checkbox"]')].reduce((s, el) => el && el.checked ? s = (s || '') + el.value + '$#' : s || '') } 
  * { box-sizing: border-box; } #data { padding:5px; width:100vw; } .multiselect { overflow: visible; padding:0; padding-left:1px; border:none; background-color:#eee; width:100vw; white-space: normal; height:75px; } .checkboxes { height:100px; width:100px; border:1px solid #000; background-color:white; margin-left:-1px; display:inline-block; } label { display: inline-block; border: 1px grey solid; padding:5px; } 
 <span onclick="">All</span> | <span onclick="">Selected</span> <input type="text" id="SearchBar" placeholder="Search for options.."> <form> <div id="data"> <div class="multiselect"> <div id="c_b"> <div id="checkboxes"> </div> </div> </div> </div> </form> <textarea id="t"></textarea> 

You can use the oninput -attribute on the search-field to call a JS-function (let's just call it search(query) for this example). 您可以在搜索字段上使用oninput -attribute来调用JS函数(在本示例中,我们将其称为search(query) )。 The call should look somewhat like this: 该调用应如下所示:

<input oninput="search(this.value);" type="text" id="SearchBar" placeholder="Search for options.." />

The search() -function the iterates through the choices -array and compare whether the parameter given to the function matches or is included in the current member of the array. search()函数在choices -array中进行迭代,并比较赋予该函数的参数是匹配还是包含在数组的当前成员中。 If that's not the case, you can add some kind of .hidden class to the nth <label> where n is the choice you are currently iterating through. 如果不是这种情况,则可以在第n个<label>中添加某种.hidden类,其中n是当前正在迭代的选择。 If it is the case, you can remove the class. 在这种情况下,您可以删除该类。 You can do that using the following jQuery functions (let's say i is the variable that holds the index of the current element): 您可以使用以下jQuery函数来完成此操作(假设i是保存当前元素索引的变量):

$("label:nth-child(" + i + ")").addClass("hidden");

and

$("label:nth-child(" + i + ")").removeClass("hidden");

The .hidden -class should look like this: .hidden类应如下所示:

.hidden {
    display:none;
}

I hope this helps. 我希望这有帮助。 If you have any questions, feel free to ask. 如果你有任何问题随时问。

You can use this JavaScript/JQuery function: 您可以使用以下JavaScript / JQuery函数:

function updateCheckboxes(x) {
  if ($('#SearchBar').val() == '') {
    $('#checkboxes > label').show();
  } else {
    $('#checkboxes > label').hide();
    $('#checkboxes > label:contains('+$('#SearchBar').val()+')').show();
  }
}

And call it oninput in the input, with this line: 并使用以下oninput在输入oninputoninput

<input id="SearchBar" placeholder="Search for options.." type="text" oninput="updateCheckboxes(this)" autocomplete="off">

And include JQuery like this at the bottom/top of the head/body; 并在头部/身体的底部/顶部包含这样的JQuery;

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

 //array of options (change this array and you change the checkboxes) var choices = new Array(); choices[0] = "January"; choices[1] = "February"; choices[2] = "March"; choices[3] = "April"; choices[4] = "May"; choices[5] = "June"; choices[6] = "July"; choices[7] = "August"; choices[8] = "September"; choices[9] = "October"; choices[10] = "November"; choices[11] = "December"; //array of value which have to be automaticly selected var target = new Array(); target[0] = "9"; target[1] = "8"; target[2] = "11"; var cbh = document.getElementById('checkboxes'); var val = ''; var cap = ""; var j = ""; var t = document.getElementById('t'); // the loop is creating the checkboxes with name, value... for (var i in choices) { //Name of checkboxes are their number so I convert the i into a string. j = i.toString(); val = j; //cap will be the value/text of choices[i] var cb = document.createElement('input'); var label = document.createElement("label"); cap = choices[i]; var text = document.createTextNode(cap); cb.type = 'checkbox'; cbh.appendChild(cb); cb.name = cap; cb.value = val; label.appendChild(cb); label.appendChild(text); cbh.appendChild(label); cb.addEventListener('click', updateText); if (target.indexOf(i) >= 0) { cb.checked = true; } } updateText(); //function which update the text area according to which checkbox is selected or not function updateText() { t.value = [null, ...document.querySelectorAll('#checkboxes [type="checkbox"]')].reduce((s, el) => el && el.checked ? s = (s || '') + el.value + '$#' : s || ''); } $.expr[":"].contains = $.expr.createPseudo(function(arg) { return function( elem ) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; }); function updateCheckboxes(x) { if ($('#SearchBar').val() == '') { $('#checkboxes > label').show(); } else { $('#checkboxes > label').hide(); $('#checkboxes > label:contains('+$('#SearchBar').val()+')').show(); } } 
 * { box-sizing: border-box; } #data { padding: 5px; width: 100vw; } .multiselect { overflow: visible; padding: 0; padding-left: 1px; border: none; background-color: #eee; width: 100vw; white-space: normal; height: 75px; } .checkboxes { height: 100px; width: 100px; border: 1px solid #000; background-color: white; margin-left: -1px; display: inline-block; } label { display: inline-block; border: 1px grey solid; padding: 5px; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <!DOCTYPE html> <html> <head> <title></title> </head> <body> <span onclick="">All</span> | <span onclick="">Selected</span> <form> <input id="SearchBar" placeholder="Search for options.." type="text" oninput="updateCheckboxes(this)" autocomplete="off"> </form> <form> <div id="data"> <div class="multiselect"> <div id="c_b"> <div id="checkboxes"></div> </div> </div> </div> </form> <textarea id="t"></textarea> </body> </html> 

Edit: to make the search case-insensitive, add this amazing JQuery, found here . 编辑:要使搜索不区分大小写,请添加此惊人的JQuery,可在此处找到。

$.expr[":"].contains = $.expr.createPseudo(function(arg) {
    return function( elem ) {
        return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM