【搜索框的匹配功能】

功能需求:

1. 输入关键字的同时,以下拉列表的形式显示匹配的内容;

2. 点击下拉列表的选项,跳转到对应的新的页面

注意:这里读取data.txt(检索的文件对象),会存在跨域的问题,所以这里启动一个服务器将静态文件挂载到服务器上。

服务器端:通过Node.js的express框架,这里跨域还需要导入cors库。

static.js


const express = require('express')
const app = express()
const cors = require('cors')

app.use(cors())
app.use(express.static('.'))  //当前目录挂载到服务器

app.listen(3000, () => {
    console.log('server is running at http://127.0.0.1:3000')
})

命令行启动服务器:

node static.js 

前端静态文件:

搜索页面.html(这里采用的layui框架,所以需要引入layui核心css和js文件)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>搜索页面</title>
    <!-- css引入 -->
    <link rel="stylesheet" href="css/layui.css">
    <style>
        .form-box{
            width: 600px;
            margin:100px auto 0;
        }
        ul li{
				line-height: 50px;
				width: 382px;
				letter-spacing: 1px;
				text-indent: 8px;
				font-size: 12px;
                font-family:Arial,Helvetica,sans-serif;
				background-color: #ffffff;
                border-style:solid;
                border-width: thin;
	            border-top:none;
                border-color: #eeeeee;
		}
        ul li a{
            display: block;
        }
		ul li:hover{
			background-color: #e9faff;
			color: #666;
        }
        
    </style>
</head>
<body>
    <div class="form-box">
        <form action="" class="layui-form">
            <div style="width: 500px; float: left;">
                <label class="layui-form-label" for="">搜索匹配:</label>
                <div class="layui-input-block">
                        <input type="text" class="layui-input" id="search-input" onkeyup="search()" placeholder="请输入">
                        <!-- 搜索结果 -->
                        <div id="search-result" style="margin-top:15px">
                    </div>
                </div>
            </div>
        </form>
    </div>
    
	<!-- 引入js -->
	<script src="js/jquery-1.11.3.min.js"></script>
    <script src="js/layui.js"></script>
    <script src="search.js"></script>
</body>
</html>

search.js

// 定义一个全局变量,用于存储解析出来的数据
var searchData = [];

// 解析数据
function parseData(dataText) {
    //每1行为分隔符号,存放在数组dataArray中
    var dataArray = dataText.split("\n");
    for (var i = 0; i < dataArray.length; i++) {
        // 解析dataArray元素中的每个字符串
        var item = dataArray[i].split(",");
        // 新的数组searchData存放的是对象(name + url)
        searchData.push({
            name: item[0],
            url: item[1]
        });
    }
}

// 搜索功能
function search() {
    var searchInput = document.getElementById("search-input");
    var searchResult = document.getElementById("search-result");
    searchResult.innerHTML = "";
    
    //搜索框输入的内容
    var keyword = searchInput.value.trim().toLowerCase();
    if (keyword === "") {
        return;
    }

    //搜索匹配
    //filter(function(item) { return 筛选的条件  })
    var matchedData = searchData.filter(function(item) {
        //返回 item对象中 name字符串中含keyword子字符串第一次出现的位置(-1表示没有)
        return item.name.toLowerCase().indexOf(keyword) !== -1;
    });

    //构造前端html中<div id="search-result" style="margin-top:15px">的内容
    var resultList = document.createElement("ul");
    matchedData.forEach(function(item) {
        var resultItem = document.createElement("li");
        var resultLink = document.createElement("a");
        //每个item都是一个对象(name + url)
        resultLink.href = item.url;
        resultLink.innerHTML = item.name;
        resultItem.appendChild(resultLink);
        resultList.appendChild(resultItem);
    });
    searchResult.appendChild(resultList);
}

// 加载数据并解析
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        parseData(xhr.responseText);
    }
};
xhr.open("GET", "data.txt");
xhr.send();

运行如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值