You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现HTML文本框调用Wikipedia API获取搜索结果?

实现维基百科API搜索功能(类似Coding Train #75)

嘿,我来帮你搞定这个维基API搜索功能!你的现有代码只是个基础的文本框表单,默认提交会刷新页面,这就是搜索时页面重置的核心原因。咱们一步步调整,加上API调用和结果展示的逻辑:

第一步:先搞定表单刷新问题

浏览器默认会在表单提交时触发页面刷新,咱们得给表单加个提交事件监听器,用preventDefault()阻止这个默认行为,这样才能让自定义的搜索逻辑跑起来。

第二步:构造维基API请求链接

维基百科提供了公开的API接口,咱们用https://en.wikipedia.org/w/api.php来访问,关键参数得记清楚:

  • action=query:告诉API咱们要执行查询操作
  • list=search:指定查询类型为内容搜索
  • srsearch=你的关键词:这里填用户输入的搜索词,要用encodeURIComponent()处理特殊字符
  • format=json:要求返回JSON格式的数据,方便JS解析
  • origin=*:解决跨域请求问题(因为咱们的页面和维基API不在同一域名下)

第三步:发送请求并渲染搜索结果

fetch()函数发送API请求,拿到返回的结果后,动态创建DOM元素把搜索结果展示在页面上。

完整可运行代码示例

<!DOCTYPE html>
<html>
<head>
    <title>维基百科搜索</title>
    <style>
        /* 简单美化页面,提升体验 */
        body {
            max-width: 800px;
            margin: 2rem auto;
            padding: 0 1rem;
            font-family: Arial, sans-serif;
        }
        #search-form {
            margin-bottom: 2rem;
            display: flex;
            gap: 0.5rem;
        }
        #search-input {
            flex: 1;
            padding: 0.6rem;
            font-size: 1rem;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        #submit-btn {
            padding: 0.6rem 1.2rem;
            font-size: 1rem;
            background-color: #0066cc;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        .result-item {
            margin-bottom: 1.2rem;
            padding: 1rem;
            border: 1px solid #eee;
            border-radius: 4px;
            transition: box-shadow 0.2s;
        }
        .result-item:hover {
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        .result-title {
            font-size: 1.2rem;
            font-weight: bold;
            margin-bottom: 0.5rem;
            color: #0066cc;
        }
        .result-snippet {
            color: #555;
            line-height: 1.4;
        }
    </style>
</head>
<body>
    <form id="search-form">
        <input type="text" id="search-input" placeholder="输入关键词搜索维基百科">
        <button type="submit" id="submit-btn">搜索</button>
    </form>
    <div id="results-container"></div>

    <script>
        // 获取页面元素
        const form = document.getElementById('search-form');
        const input = document.getElementById('search-input');
        const resultsContainer = document.getElementById('results-container');

        // 监听表单提交事件
        form.addEventListener('submit', async (e) => {
            // 阻止默认页面刷新
            e.preventDefault();
            
            // 获取并处理搜索关键词
            const searchTerm = input.value.trim();
            if (!searchTerm) {
                resultsContainer.innerHTML = '<p>请输入搜索关键词</p>';
                return;
            }

            try {
                // 构造API请求URL
                const apiUrl = `https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=${encodeURIComponent(searchTerm)}&format=json&origin=*`;
                
                // 发送请求并解析返回数据
                const response = await fetch(apiUrl);
                const data = await response.json();
                
                // 清空之前的搜索结果
                resultsContainer.innerHTML = '';
                
                // 遍历结果并渲染到页面
                data.query.search.forEach(result => {
                    const resultItem = document.createElement('div');
                    resultItem.className = 'result-item';
                    
                    const title = document.createElement('div');
                    title.className = 'result-title';
                    title.textContent = result.title;
                    
                    const snippet = document.createElement('div');
                    snippet.className = 'result-snippet';
                    // 维基返回的摘要带高亮标签,用innerHTML解析
                    snippet.innerHTML = result.snippet;
                    
                    resultItem.appendChild(title);
                    resultItem.appendChild(snippet);
                    resultsContainer.appendChild(resultItem);
                });

                // 如果没有搜索结果
                if (data.query.search.length === 0) {
                    resultsContainer.innerHTML = '<p>没有找到相关结果,请尝试其他关键词</p>';
                }
            } catch (error) {
                console.error('搜索请求出错:', error);
                resultsContainer.innerHTML = '<p>搜索出错了,请稍后重试</p>';
            }
        });
    </script>
</body>
</html>

关键代码说明

  1. 阻止默认提交e.preventDefault()让表单提交时不再刷新页面,转而执行咱们的搜索逻辑。
  2. API请求处理:用encodeURIComponent()处理搜索关键词,避免特殊字符破坏URL结构;origin=*是跨域请求的必需参数。
  3. 结果渲染:遍历API返回的搜索结果数组,动态创建DOM元素展示标题和摘要,摘要用innerHTML解析是因为维基返回的内容带关键词高亮的HTML标签。
  4. 异常处理:用try/catch捕获请求过程中的网络错误或数据解析错误,给用户友好的提示。

现在用Brackets运行这段代码,输入关键词搜索,就能看到和Coding Train #75类似的维基百科搜索结果啦!

内容的提问来源于stack exchange,提问作者Constantin

火山引擎 最新活动