在表单字段外单击时隐藏自动填充下拉菜单
Hide autofill dropdown on click outside of form field
我进行了自动填充搜索,当您在表单字段中键入内容时,它会填充来自数组的结果下拉列表。
我遇到的问题是,当您在下拉菜单外单击时,它会消失,但当您再次开始在表单字段中输入时,下拉菜单不会显示。我正在尝试使用 jQuery 来实现这一点:
这是为了在搜索字段下显示下拉菜单:
const input = document.querySelector('#FAVORITE_LOCATION');
const suggestions = document.querySelector('.suggestions ul');
const country = ['USA', 'Canada'];
function search(str) {
let results = [];
const val = str.toLowerCase();
for (i = 0; i < country.length; i++) {
if (country[i].toLowerCase().indexOf(val) > -1) {
results.push(country[i]);
}
}
return results;
}
function searchHandler(e) {
const inputVal = e.currentTarget.value;
let results = [];
if (inputVal.length > 0) {
results = search(inputVal);
}
showSuggestions(results);
}
function showSuggestions(results) {
suggestions.innerHTML = '';
if (results.length > 0) {
for (i = 0; i < results.length; i++) {
suggestions.innerHTML += `<li>${results[i]}</li>`;
}
suggestions.classList.add('has-suggestions');
} else {
results = [];
suggestions.innerHTML = '';
suggestions.classList.remove('has-suggestions');
}
}
function useSuggestion(e) {
input.value = e.target.innerText;
input.focus();
suggestions.innerHTML = '';
suggestions.classList.remove('has-suggestions');
}
input.addEventListener('keyup', searchHandler);
suggestions.addEventListener('click', useSuggestion);
下面是我试图隐藏已填充的自动填充的位置:
$(document).on('click', function(event){
var container = $("ul.has-suggestions");
if (!container.is(event.target) &&
container.has(event.target).length === 0)
{
container.hide();
}else{
container.show();
}
});
最后,这是下拉菜单本身的 CSS
.search-container {
position: relative;
}
.search-container input,
.search-container .suggestions {
width: 100%;
}
.search-container input {
background-color: white;
height: 60px;
padding: 0 10px;
}
.search-container .suggestions {
position: absolute;
top: 80px;
}
ul {
display: none;
list-style-type: none;
padding: 0;
margin: 0;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
max-height: 200px;
overflow-y: auto;
}
ul.has-suggestions {
display: block;
}
ul li {
padding: 10px;
cursor: pointer;
background-color: white;
color: black;
}
ul.has-suggestions 设置为 display:block 当用户开始在表单字段中输入内容时,表单字段会显示一个已填充的下拉列表。我尝试使用 if/else 语句并使用 .show();但它似乎不起作用。
如有任何帮助,我们将不胜感激!
谢谢!
你可能想做这样的事情来显示and/or隐藏你的自动完成建议:
input.addEventListener('blur', function() {
$("ul.has-suggestions").hide();
})
input.addEventListener('focus', function() {
$("ul.has-suggestions").show();
})
使用请求的更新编辑 2;
codepen with example
第二个 codepen 使用单击的值填充表单字段。
我进行了自动填充搜索,当您在表单字段中键入内容时,它会填充来自数组的结果下拉列表。
我遇到的问题是,当您在下拉菜单外单击时,它会消失,但当您再次开始在表单字段中输入时,下拉菜单不会显示。我正在尝试使用 jQuery 来实现这一点:
这是为了在搜索字段下显示下拉菜单:
const input = document.querySelector('#FAVORITE_LOCATION');
const suggestions = document.querySelector('.suggestions ul');
const country = ['USA', 'Canada'];
function search(str) {
let results = [];
const val = str.toLowerCase();
for (i = 0; i < country.length; i++) {
if (country[i].toLowerCase().indexOf(val) > -1) {
results.push(country[i]);
}
}
return results;
}
function searchHandler(e) {
const inputVal = e.currentTarget.value;
let results = [];
if (inputVal.length > 0) {
results = search(inputVal);
}
showSuggestions(results);
}
function showSuggestions(results) {
suggestions.innerHTML = '';
if (results.length > 0) {
for (i = 0; i < results.length; i++) {
suggestions.innerHTML += `<li>${results[i]}</li>`;
}
suggestions.classList.add('has-suggestions');
} else {
results = [];
suggestions.innerHTML = '';
suggestions.classList.remove('has-suggestions');
}
}
function useSuggestion(e) {
input.value = e.target.innerText;
input.focus();
suggestions.innerHTML = '';
suggestions.classList.remove('has-suggestions');
}
input.addEventListener('keyup', searchHandler);
suggestions.addEventListener('click', useSuggestion);
下面是我试图隐藏已填充的自动填充的位置:
$(document).on('click', function(event){
var container = $("ul.has-suggestions");
if (!container.is(event.target) &&
container.has(event.target).length === 0)
{
container.hide();
}else{
container.show();
}
});
最后,这是下拉菜单本身的 CSS
.search-container {
position: relative;
}
.search-container input,
.search-container .suggestions {
width: 100%;
}
.search-container input {
background-color: white;
height: 60px;
padding: 0 10px;
}
.search-container .suggestions {
position: absolute;
top: 80px;
}
ul {
display: none;
list-style-type: none;
padding: 0;
margin: 0;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
max-height: 200px;
overflow-y: auto;
}
ul.has-suggestions {
display: block;
}
ul li {
padding: 10px;
cursor: pointer;
background-color: white;
color: black;
}
ul.has-suggestions 设置为 display:block 当用户开始在表单字段中输入内容时,表单字段会显示一个已填充的下拉列表。我尝试使用 if/else 语句并使用 .show();但它似乎不起作用。
如有任何帮助,我们将不胜感激!
谢谢!
你可能想做这样的事情来显示and/or隐藏你的自动完成建议:
input.addEventListener('blur', function() {
$("ul.has-suggestions").hide();
})
input.addEventListener('focus', function() {
$("ul.has-suggestions").show();
})
使用请求的更新编辑 2; codepen with example
第二个 codepen 使用单击的值填充表单字段。