在织梦CMS中,JavaScript通常用于处理前端的交互逻辑,特别是搜索功能,JavaScript可以实现无刷新搜索、搜索建议/自动补全、表单验证等,从而提升用户体验。

(图片来源网络,侵删)
下面我将从几个核心场景来拆解织梦搜索相关的JavaScript代码。
标准的搜索表单提交(最常见)
这是最基础的形式,用户输入关键词,点击搜索,页面跳转到搜索结果页。
HTML 表单结构
在织梦的模板文件中(通常是 head.htm, header.htm 或 search.htm),你会找到这样的表单代码:
<form name="formsearch" action="{dede:global.cfg_cmsurl/}/search.php" method="get">
<div class="form-search">
<input type="hidden" name="kwtype" value="0" />
<input type="hidden" name="searchtype" value="keyword" />
<input type="text" name="q" id="search-keyword" class="search-keyword" placeholder="请输入搜索关键词" />
<button type="submit" class="search-submit">搜索</button>
</div>
</form>
代码解析:

(图片来源网络,侵删)
action="{dede:global.cfg_cmsurl/}/search.php": 这是表单提交的目标地址,即织梦的搜索程序。{dede:global.cfg_cmsurl/}是织梦的全局标签,用于获取网站的根目录URL。method="get": 使用 GET 方法提交,这意味着搜索关键词会以?q=关键词的形式出现在URL中,方便用户收藏和分享。<input type="hidden" name="kwtype" value="0" />: 这是一个隐藏字段,用于定义关键词的匹配方式。kwtype=0: 精确匹配kwtype=1: 模糊匹配
<input type="hidden" name="searchtype" value="keyword" />: 定义搜索的类型,通常是keyword(关键词搜索)。<input type="text" name="q" ...>: 这是用户输入搜索关键词的输入框。name="q"是一个非常通用的做法,很多搜索引擎都使用q作为查询参数名。<button type="submit">...</button>: 提交按钮,类型为submit,点击后会触发表单的submit事件,将数据发送到action指定的地址。
相关的 JavaScript 代码
对于这个标准表单,通常不需要额外的JavaScript来处理提交,因为浏览器原生就支持 type="submit" 的按钮。
我们经常会用JavaScript来做一些增强,
- 回车键提交: 在输入框中监听
keydown事件,当按下回车键(keyCode为 13)时,触发表单提交。 - 表单验证: 在提交前检查输入框是否为空。
示例代码:
document.addEventListener('DOMContentLoaded', function() {
// 获取表单和输入框元素
const searchForm = document.querySelector('form[name="formsearch"]');
const searchInput = document.getElementById('search-keyword');
if (searchForm && searchInput) {
// 方法一:使用原生 onsubmit 事件(推荐)
searchForm.onsubmit = function() {
// 简单的表单验证
if (searchInput.value.trim() === '') {
alert('请输入搜索关键词!');
searchInput.focus(); // 让输入框获得焦点
return false; // 阻止表单提交
}
// 可以在这里添加其他逻辑,比如加载动画等
return true; // 允许表单提交
};
// 方法二:监听输入框的回车键事件
searchInput.addEventListener('keydown', function(event) {
if (event.key === 'Enter') {
// 同样可以在这里做验证
if (searchInput.value.trim() === '') {
alert('请输入搜索关键词!');
searchInput.focus();
event.preventDefault(); // 阻止回车的默认行为(换行或提交)
}
}
});
}
});
Ajax 无刷新搜索
这是提升用户体验的关键技术,用户输入关键词后,搜索结果直接显示在当前页,无需刷新或跳转。

(图片来源网络,侵删)
工作原理
- 监听输入: JavaScript 监听搜索输入框的
input事件(或keyup事件)。 - 获取关键词: 当用户输入时,获取输入框的值。
- 发送请求: 使用
fetchAPI 或XMLHttpRequest(XHR) 向一个后端接口发送异步请求,这个接口可以是一个自定义的PHP文件,用于处理搜索逻辑并返回JSON格式的数据。 - 处理响应: 接收到后端返回的JSON数据后,使用JavaScript动态地将数据渲染到页面上的指定区域(一个
<div id="search-results">...</div>)。 - 更新UI: 清空旧的搜索结果,显示新的结果。
前端 JavaScript 代码示例
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.getElementById('search-keyword');
const searchResults = document.getElementById('search-results'); // 用于显示结果的容器
let debounceTimer; // 用于防抖的计时器
if (!searchInput || !searchResults) {
return; // 如果元素不存在,则不执行
}
// 监听输入框的输入事件
searchInput.addEventListener('input', function() {
const keyword = this.value.trim();
// 防抖处理:如果用户在短时间内连续输入,只发送最后一次的请求
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
if (keyword === '') {
searchResults.innerHTML = ''; // 如果清空输入,则清空结果
return;
}
// 使用 Fetch API 发送请求
// 注意:这里假设你有一个 /ajax_search.php 文件来处理搜索
fetch(`/ajax_search.php?q=${encodeURIComponent(keyword)}`)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json(); // 将响应体解析为JSON
})
.then(data => {
// 渲染搜索结果
renderSearchResults(data);
})
.catch(error => {
console.error('搜索出错:', error);
searchResults.innerHTML = '<p>搜索出错,请稍后再试。</p>';
});
}, 300); // 300毫秒的延迟
});
// 渲染搜索结果的函数
function renderSearchResults(data) {
if (!data || data.length === 0) {
searchResults.innerHTML = '<p>没有找到相关结果。</p>';
return;
}
let html = '<ul>';
data.forEach(item => {
// 这里根据你返回的JSON数据结构来构建HTML
// 假设返回的数据有 title, arcurl, litpic 等字段
html += `
<li>
<a href="${item.arcurl}" target="_blank">
<img src="${item.litpic}" alt="${item.title}">
<h3>${item.title}</h3>
</a>
</li>
`;
});
html += '</ul>';
searchResults.innerHTML = html;
}
});
后端 PHP 接口示例 (ajax_search.php)
这个文件需要自己创建,它负责执行数据库查询并返回JSON。
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php"); // 引入织梦核心文件
header('Content-Type: application/json; charset=utf-8');
$keyword = isset($_GET['q']) ? trim($_GET['q']) : '';
if (empty($keyword)) {
echo json_encode([]);
exit;
}
// 设置查询条件
$addquery = " AND (title LIKE '%$keyword%' OR body LIKE '%$keyword%')";
// 调用织梦的 getKeywordSearch 函数(或者自己写SQL查询)
// 注意:直接使用SQL拼接有SQL注入风险,生产环境请使用预处理语句。
// 这里为了演示,简化了查询过程。
// 更安全的方式是使用织梦自带的函数,但织梦本身没有直接返回JSON的搜索函数。
// 所以我们通常自己写一个安全的查询。
$results = array();
$dsql->SetQuery("SELECT id, title, litpic, arcurl FROM dede_archives WHERE arcrank > -1 $addquery ORDER BY pubdate DESC LIMIT 10"); // 查询10条结果
$dsql->Execute('t');
while ($row = $dsql->GetArray('t')) {
$row['arcurl'] = GetFileUrl($row['id'], $row['typeid'], $row['senddate'], $row['title'], $row['ismake'], $row['arcrank'], $row['namerule'], $row['typedir'], $row['money'], $row['filename'], $row['moresite'], $row['siteurl'], $row['sitepath']);
$results[] = $row;
}
echo json_encode($results);
?>
搜索建议/自动补全
当用户输入时,下方出现一个下拉框,列出相关的热门搜索或历史搜索,用户可以快速选择。
这个功能通常基于 Ajax无刷新搜索 的基础之上,只是返回的数据更少(比如只返回标题),并且展示方式不同。
HTML 结构
<div class="search-wrapper">
<form name="formsearch" action="{dede:global.cfg_cmsurl/}/search.php" method="get">
<input type="text" name="q" id="search-keyword" autocomplete="off" />
<button type="submit">搜索</button>
</form>
<!-- 建议框 -->
<div id="search-suggestions" class="suggestions-box" style="display: none;"></div>
</div>
JavaScript 代码
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.getElementById('search-keyword');
const suggestionsBox = document.getElementById('search-suggestions');
if (!searchInput || !suggestionsBox) return;
searchInput.addEventListener('input', function() {
const keyword = this.value.trim();
// 清除之前的防抖定时器
clearTimeout(this.debounceTimer);
this.debounceTimer = setTimeout(() => {
if (keyword === '') {
suggestionsBox.style.display = 'none';
return;
}
// 请求建议数据
fetch(`/get_suggestions.php?q=${encodeURIComponent(keyword)}`)
.then(response => response.json())
.then(suggestions => {
if (suggestions.length > 0) {
showSuggestions(suggestions);
} else {
suggestionsBox.style.display = 'none';
}
})
.catch(error => {
console.error('获取建议失败:', error);
suggestionsBox.style.display = 'none';
});
}, 200); // 建议的延迟可以更短一些
});
// 显示建议列表
function showSuggestions(suggestions) {
let html = '<ul>';
suggestions.forEach(suggestion => {
html += `<li onclick="selectSuggestion('${suggestion}')">${suggestion}</li>`;
});
html += '</ul>';
suggestionsBox.innerHTML = html;
suggestionsBox.style.display = 'block';
}
// 点击页面其他地方时隐藏建议框
document.addEventListener('click', function(event) {
if (!searchInput.contains(event.target) && !suggestionsBox.contains(event.target)) {
suggestionsBox.style.display = 'none';
}
});
});
// 全局函数,供建议项的 li 标签的 onclick 事件调用
function selectSuggestion(keyword) {
document.getElementById('search-keyword').value = keyword;
document.getElementById('search-suggestions').style.display = 'none';
// 可以选择性地直接提交表单
// document.querySelector('form[name="formsearch"]').submit();
}
后端 PHP 接口 (get_suggestions.php)
这个接口可以返回热门关键词、用户历史搜索或简单的匹配结果。
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
header('Content-Type: application/json; charset=utf-8');
$keyword = isset($_GET['q']) ? trim($_GET['q']) : '';
$suggestions = [];
// 示例1:从 dede_search_keywords 表获取热门搜索
if (!empty($keyword)) {
$dsql->SetQuery("keyword FROM dede_search_keywords WHERE keyword LIKE '%$keyword%' ORDER BY count DESC LIMIT 5");
$dsql->Execute('t');
while ($row = $dsql->GetArray('t')) {
$suggestions[] = $row['keyword'];
}
} else {
// 示例2:如果没有关键词,返回默认的热门搜索
$dsql->SetQuery("keyword FROM dede_search_keywords ORDER BY count DESC LIMIT 10");
$dsql->Execute('t');
while ($row = $dsql->GetArray('t')) {
$suggestions[] = $row['keyword'];
}
}
echo json_encode(array_unique($suggestions)); // 使用 array_unique 避免重复
?>
| 功能 | 核心技术 | 织梦实现要点 |
|---|---|---|
| 标准搜索 | HTML Form, GET/POST | action 指向 /search.php,name="q" 接收关键词。 |
| Ajax搜索 | JavaScript (fetch/XMLHttpRequest), JSON | 前端监听 input 事件,发送异步请求。后端创建PHP接口(如 ajax_search.php),使用 $dsql 查询数据库并返回JSON。 |
| 搜索建议 | Ajax搜索 + DOM操作 | 在Ajax搜索基础上,简化后端返回数据(只需关键词)。 前端动态创建下拉列表,并处理点击事件。 |
在开发织梦搜索相关的JavaScript时,关键在于理解织梦的标签如何生成HTML,以及如何利用织梦的核心文件(common.inc.php)和数据库类($dsql)来创建自己的后端API,实现与前端的完美交互。
