gpt4 book ai didi

javascript - for 循环中的 setAttribute 无法按我的预期工作

转载 作者:行者123 更新时间:2023-12-02 22:29:25 26 4
gpt4 key购买 nike

当用户对输入进行任何更改时,浏览器将使用 for 循环循环所有 li 标签,并检查尝试 indexOf(inputText) 时返回的内容。如果indexOf返回-1,则需要过滤它并且不显示在屏幕上。

这是我的简单 HTML

<form>
....
<div>
<input type="text" name="ingredientSearch" placeholder="ingredients..">
</div>
</form>
<div id="IngredientsList" class="noneDisplay">
<ul>
<li class="items">Apple</li>
<li class="items">Asparagus</li>
<li class="items">Baking Powder</li>
<li class="items">Balsamic Vinegar</li>
.......
.......
<li class="items">Vinegar</li>
<li class="items">Wheat Flour</li>
<li class="items">White Wine</li>
</ul>
</div>

这是我的 JavaScript 代码。

function showListItems(){
let searchField=document.getElementsByName("ingredientSearch")[0];
let items = document.getElementsByClassName("items");
searchField.addEventListener("keyup",function(){
if(document.getElementById("IngredientsList").hasAttribute("class","noneDisplay")){
document.getElementById("IngredientsList").removeAttribute("class","noneDisplay");
}
filterListItems(items);
})
}

function filterListItems(items){
let inputText = document.getElementsByName("ingredientSearch")[0].value.toUpperCase();
for(var i=0;i<items.length;i++){
let itemsText = items[i].textContent.toUpperCase();
if(itemsText.indexOf(inputText)==-1){
items[i].setAttribute('class','noneDisplay');
}else{
items[i].removeAttribute('class','noneDisplay');
}
}

}

showListItems();

class noneDisplay 表示 css display:none

所以我的想法是,如果我在输入中键入 apple,浏览器会将 class noneDisplay 设置为除第一个列表项之外的所有列表项。如果用户输入 Strawberry,浏览器会将类 noneDisplay 设置为除具有值 Strawberry 的列表之外的所有列表项。

但这就是我得到的

enter image description here enter image description here

如果你能在没有 Jquery 的情况下帮助我,那将非常感谢,因为我正在尝试没有它。

最佳答案

根据您的回答,我假设您正在尝试修改元素的类。您可以利用classList用于该目的的属性(property)。我已经清理了您的一些代码并对其进行了格式化。

function showListItems() {
const searchField = document.getElementsByName("ingredientSearch")[0];
const items = document.getElementsByClassName("items");
searchField.addEventListener("keyup", function() {
const ingredientsList = document.getElementById("IngredientsList");
if (ingredientsList.classList.contains("noneDisplay")) {
ingredientsList.classList.remove("noneDisplay");
}
filterListItems(items);
});
}

function filterListItems(items) {
const inputText = document.getElementsByName("ingredientSearch")[0].value.toUpperCase();
for (let i = 0; i < items.length; i++) {
const itemsText = items[i].textContent.toUpperCase();
if (itemsText.indexOf(inputText) > -1) {
items[i].classList.remove("noneDisplay");
continue;
}
items[i].classList.add("noneDisplay");
}
}

showListItems();

正如评论中提到的,我个人认为你可以根据 items 数组过滤并映射到 ul 列表中,我认为这样更简单这样做,更容易维护,也更容易阅读。

<!DOCTYPE html>
<html>
<meta charset="utf-8" />
<body>
<input id="input" placeholder="Search..." />
<ul id="ingredients-list">
<!-- List items will be created with javascript -->
</ul>
<script>
const updateList = (items = []) => {
const list = document.getElementById("ingredients-list");
// Clear list items
while (list.firstChild) {
list.firstChild.remove();
}
if (items && Array.isArray(items) && items.length > 0) {
// Rerender with new list items
items.forEach(item => {
const listItem = document.createElement("li");
listItem.appendChild(document.createTextNode(item));
list.appendChild(listItem);
});
}
};

const handleOnChange = e => {
const { value } = e.target;
updateList(
items.filter(item => item.toUpperCase().includes(value.toUpperCase()))
);
};

const items = [
"Apple",
"Asparagus",
"Baking Powder",
"Balsamic Vinegar",
"Vinegar",
"Wheat Flour",
"White Wine"
];

updateList(items);

const input = document.getElementById("input");
input.addEventListener("keyup", handleOnChange);
</script>
</body>
</html>

使用我的方法进行工作演示:https://codesandbox.io/s/html-filter-list-nolnk?fontsize=14&hidenavigation=1&theme=dark

关于javascript - for 循环中的 setAttribute 无法按我的预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com