如何让搜索栏中的某些关键词不可搜索?

前端开发 2026-07-09

供参考,我从 这个视频 获取了代码。

我想设计一个搜索栏,里面的关键字是指向我文件夹中某个独立文件的链接。搜索栏工作正常,但问题在于由于所有关键字都是链接,某些字母会触发所有结果显示。例如,假设我把所有文件按水果命名,放在一个数组里,如下所示:

let avaliableKeywords = [
<a href='/fruits/apples.html'>Apples</a>
<a href='/fruits/bananas.html'>Bananas</a>
<a href='/fruits/oranges.html'>Oranges</a>
<a href='/fruits/strawberries.html'>Strawberries</a>
]

如果我输入 "a href" 或者 "fruits" 里的任意字母,所有结果都会显示出来,但我只想让水果本身可以被搜索。例如,输入 "e" 应该显示Apples、Oranges和 Strawberries,但不显示Bananas。输入 "f" 应该不返回任何结果,等等。

以下是我的代码的其余部分:

const resultsBox = document.querySelector(".result-box");
const inputBox = document.getElementById("input-box");

inputBox.onkeyup = function(){
    let result = [];
    let input = inputBox.value;
    if(input.length){
        result = avaliableKeywords.filter((keyword)=>{
            return keyword.toLowerCase().includes(input.toLowerCase());
        });
        console.log(result);
    }
    display(result);


    /*if(!result.length){
        resultsBox.innerHTML = '';
    }*/
}

function display(result){
    const content = result.map((list)=>{
        return "<li>" + list + "</li>";
    });
    resultsBox.innerHTML = "<ul>" + content.join('') + "</ul>";
}

解决方案

你的意图显然是在一个框里显示经过筛选的链接。然而,过滤本身由于链接内容而产生了错误的正样本,因为你打算通过链接的内部文本来筛选,并在一个框里显示匹配项的完整链接。实现这一点的一种方法是根据内部文本来推断。

let avaliableKeywords = [
`<a href='/fruits/apples.html'>Apples</a>`,
`<a href='/fruits/bananas.html'>Bananas</a>`,
`<a href='/fruits/oranges.html'>Oranges</a>`,
`<a href='/fruits/strawberries.html'>Strawberries</a>`
]
function innerText(input) {
    return input.split("</a>")[0].split("'>")[1]
}
const resultsBox = document.querySelector(".result-box");
const inputBox = document.getElementById("input-box");

inputBox.onkeyup = function(){
    let result = [];
    let input = inputBox.value;
    if(input.length){
        result = avaliableKeywords.filter((keyword)=>{
            return innerText(keyword).toLowerCase().includes(input.toLowerCase());
        });
        resultsBox.innerHTML = result.join();
    }
    display(result);


    /*if(!result.length){
        resultsBox.innerHTML = '';
    }*/
}

function display(result){
    const content = result.map((list)=>{
        return "<li>" + list + "</li>";
    });
    resultsBox.innerHTML = "<ul>" + content.join('') + "</ul>";
}
<input id="input-box" type="text">
<div class="result-box">

另一种方法是使用键值对,通过键进行搜索并显示值:

let avaliableKeywords = [
{key: 'Apples', value: `<a href='/fruits/apples.html'>Apples</a>`},
{key: 'Bananas', value: `<a href='/fruits/bananas.html'>Bananas</a>`},
{key: 'Oranges', value: `<a href='/fruits/oranges.html'>Oranges</a>`},
{key: 'Strawberries', value: `<a href='/fruits/strawberries.html'>Strawberries</a>`},
]
const resultsBox = document.querySelector(".result-box");
const inputBox = document.getElementById("input-box");

inputBox.onkeyup = function(){
    let result = [];
    let input = inputBox.value;
    if(input.length){
        result = avaliableKeywords.filter(link => {
            return link.key.toLowerCase().includes(input.toLowerCase());
        }).map(item => item.value);
        resultsBox.innerHTML = result.join();
    }
    display(result);


    /*if(!result.length){
        resultsBox.innerHTML = '';
    }*/
}

function display(result){
    const content = result.map((list)=>{
        return "<li>" + list + "</li>";
    });
    resultsBox.innerHTML = "<ul>" + content.join('') + "</ul>";
}
<input id="input-box" type="text">
<div class="result-box">
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章