Я получаю сообщение об ошибке «Uncaught TypeError:« x »не является функцией».Я полагаю, что это может иметь отношение к тому, как я вызываю функцию внутри HTML, но сохраняю функцию из внешнего файла, но все мои исследования показывают, что это вообще не должно быть проблемой.
Я даже поместил ссылку на скрипт на внешнюю ссылку выше в html-файл на случай, если каскадная загрузка вызывает вызов функции до того, как она будет найдена там, где она определена, но я считаю, что javascript на самом деле не так... сделать это?
Я сделал много проблем по этому вопросу, и каждый проверяющий, который я пробовал, говорит, что мой JS чист, и я изменил имя функции с «автозаполнение» на «searchBar»надеясь, что автозаполнение - это зарезервированное слово или что-то, но не игра в кости.
Я также получил ту же ошибку с фрагментом кода stackoverflow, хотя я вызываю функцию в том же документе после она была определена, так что теперь я не уверен, чтовопрос может быть?
function searchBar(arr) {
var currentFocus,
inp = $(this),
wrapper = $('.autocomplete-wrapper');
// when triggering input is changed, run function
$(this).change(function() {
var a = $(this).sibling().find('.autocomplete-item-wrapper'),
b,
i,
val = $(this).value;
closeAllLists();
if (!val) return false;
currentFocus = -1;
for (i = 0; i < arr.length; i++) {
if (arr[i].substring(0, val.length).toUpperCase() == val.toUpperCase()) {
// creates a div element for each matching element
b = document.createElement('div');
// makes the matching letters bold
b.html("<strong>" + arr[i].substring(0, val.length) + "</strong");
b.innerHTML += arr[i].substring(val.length);
// inserts a input field that will hold the current array item's value
b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
// inserts the item into the input when clicked
b.click(function(e) {
inp.value = this.getElementsByTagName("input")[0].value;
closeAllLists();
});
a.append(b);
};
};
});
inp.keydown(function(e) {
var x = a;
if (x) x = x.getElementsByTagName("div");
if (e.keyCode == 40) { // arrow down
currentFocus++;
/*and and make the current item more visible:*/
addActive(x);
}
else if (e.keyCode == 38) { //up
/*If the arrow UP key is pressed,
decrease the currentFocus variable:*/
currentFocus--;
/*and and make the current item more visible:*/
addActive(x);
}
else if (e.keyCode == 13) {
/*If the ENTER key is pressed, prevent the form from being submitted,*/
e.preventDefault();
// if (currentFocus > -1) {
// /*and simulate a click on the "active" item:*/
// if (x) x[currentFocus].click();
// }
}
});
function addActive(x) {
// a function to classify an item as "active"
if (!x) return false;
// start by removing the "active" class on all items
removeActive(x);
if (currentFocus >= x.length) currentFocus = 0;
if (currentFocus < 0) currentFocus = (x.length - 1);
/*add class "autocomplete-active":*/
x[currentFocus].classList.add("autocomplete-active");
};
function removeActive(x) {
/*a function to remove the "active" class from all autocomplete items:*/
for (var i = 0; i < x.length; i++) {
x[i].classList.remove("autocomplete-active");
}
};
function closeAllLists(elmnt) {
/*close all autocomplete lists in the document,
except the one passed as an argument:*/
var x = document.getElementsByClassName("autocomplete-items");
for (var i = 0; i < x.length; i++) {
if (elmnt != x[i] && elmnt != inp) {
x[i].parentNode.removeChild(x[i]);
}
}
};
};
var options = ["acorn squash","alfredo sauce","alligator","almond extract","almonds","anchovy","anchovy paste","angelica","apple butter","applesauce","apricots","artichokes","baking soda","barbecue sauce"];
$("#searchbar").searchBar('options');
body {
font-size: 16px;
background: #f6f6f6;
}
.search::after {
content: '';
display:table;
clear: both;
}
.search {
width: 300px;
margin: 5rem auto;
}
input {
height: 3rem;
display: block;
float: left;
border: none;
outline: none;
}
input[type="search"] {
width: calc(100% - 4rem);
padding: 1rem;
box-sizing: border-box;
border: 1px solid #e0e0e0;
}
input[type="submit"] {
width: 4rem;
background: DodgerBlue;
color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<div class="search">
<input id="searchbar" type="search">
<input type="submit">
<div class="autocomplete-wrapper">
<div class="autocomplete-item-wrapper">
</div>
</div>
</div>
<!-- For the sake of showing how I'm linking files and calling the function.
<!-- jQuery - - >
<script src="js/jquery-3.3.1.min.js"></script>
<!-- Autocomplete - - >
<script src="js/search-autocomplete.js"></script>
<script>
var options = {
url: "js/searchterms.js"
};
$("#searchbar").searchBar('options');
</script> -->
</body>
Этот код в значительной степени соответствует учебному пособию W3School по созданию автозаполнения.