Hice una etiqueta selecta con html que contiene todos los nombres de los países y quiero buscar en sus valores con la barra de búsqueda sin ningún complemento o add-on ¿es eso posible?
Sí, puedes, primero, verlo en acción en esta demostración , si te gusta lo que ves, esta es la forma de hacerlo:
Es bastante sencillo, una entrada de búsqueda y una selección con algunas opciones.
searchBox = document.querySelector("#searchBox"); countries = document.querySelector("#countries"); var when = "keyup"; //You can change this to keydown, keypress or change searchBox.addEventListener("keyup", function (e) { var text = e.target.value; var options = countries.options; for (var i = 0; i < options.length; i++) { var option = options[i]; var optionText = option.text; var lowerOptionText = optionText.toLowerCase(); var lowerText = text.toLowerCase(); var regex = new RegExp("^" + text, "i"); var match = optionText.match(regex); var contains = lowerOptionText.indexOf(lowerText) != -1; if (match || contains) { option.selected = true; return; } searchBox.selectedIndex = 0; } });
Primero, las variables:
HTMLElement
. HTMLElement
. objects
opciones de selección. object
opción (ej. "Argentina") y el otro es la versión más baja para pruebas que no distinguen entre mayúsculas y minúsculas (ej. "argentina") RegExp Object
, una expresión regular, básicamente lo que hace es probar (no distingue entre mayúsculas y minúsculas, debido a la 'i' en el segundo parámetro) si alguna cadena comienza con algún valor, en este caso, el valor sería el texto de entrada. RegExp Object
contra el texto de la opción, lo que significa que probará si el texto ingresado es el mismo que el comienzo del texto de la opción. Pocos, eso fue mucho, entonces, ¿por qué necesitamos 2 pruebas? Debido a que hay dos posibilidades para la selección con searchBox, una es que cuando empiezas a escribir "Unidad ..." debe coincidir con "Estados Unidos de América" (regexp), y la otra es que simplemente escribes "América" y debería también coincide con "Estados Unidos de América" (contiene)
Por lo tanto, verifica ambas pruebas, y si alguna de ellas es verdadera, seleccionará esa opción. (También regresará para que no continúe ejecutando el código)
Por defecto, si ninguna prueba es verdadera, seleccionará el primer elemento de la selección.
Espero que ayude 🙂
Si no debe usar un plugin o script de terceros, podría crear una matriz para llenar las opciones y la búsqueda a través de la matriz usando inarray http://api.jquery.com/jquery.inarray/ , entonces necesitaría tener una método para seleccionar el resultado y usar el valor del iterador para vincularlo a la opción de selección correspondiente.
También hay esta publicación: Busque las opciones de una selección, encuentre el valor, agregue seleccionado a él y escriba su texto html en un div
Thank you @undefined In your code instead of making it selected i want to disabled it like display none. But display: none not working in IE11 What I did is disabled the un matched options and the hide them. After this I have sorted the options to show only enabled options on top. The code I have written is pasted below - please try to understand the logic I hope it will work to disabled the options use $("#addselect option")attr('disabled', 'disabled').hide and to again enable it use $("#addselect option").removeAttr('disabled').show(); sort by disabled options. $("#addselect option").each(function (i, val) { if ($(this)[i].disabled) { moveDown("selectId"); } else { moveUp("selectId"); } } function moveUp(selectId) { var selectList = document.getElementById(selectId); var selectOptions = selectList.getElementsByTagName('option'); for (var i = 1; i < selectOptions.length; i++) { var opt = selectOptions[i]; if (!opt.disabled) { selectList.removeChild(opt); selectList.insertBefore(opt, selectOptions[i - 1]); } } } function moveDown(selectId) { var selectList = document.getElementById(selectId); var selectOptions = selectList.getElementsByTagName('option'); for (var i = selectOptions.length - 2; i >= 0; i--) { var opt = selectOptions[i]; if (opt.disabled) { var nextOpt = selectOptions[i + 1]; opt = selectList.removeChild(opt); nextOpt = selectList.replaceChild(opt, nextOpt); selectList.insertBefore(nextOpt, opt); } } }