JavaScript分节文本搜索功能获取对应节号的实现方法咨询
实现方案
你只需要在遍历段落的过程中维护一个当前节号变量,每次遇到带节号的段落就更新该变量,匹配到内容时直接取当前的节号存储即可,修改后的完整代码如下:
function srch() { var input, currentVerseNr, p, cache1, resultEl; input = "MTV"; currentVerseNr = ""; // 存储当前所属的节号 cache1 = []; resultEl = document.getElementById('reslt'); p = document.getElementsByTagName('p'); // 清空上次搜索结果 resultEl.innerHTML = ""; for (let i = 0; i < p.length; i++) { // 先判断当前段落是否带节号,有则更新当前节号 const verseNrEl = p[i].querySelector('.verse-nr'); if (verseNrEl) { currentVerseNr = verseNrEl.textContent.trim(); } // 匹配关键词逻辑 if (p[i].innerHTML.indexOf(input) > -1) { // 同时存储节号和内容 cache1.push({ verse: currentVerseNr, content: p[i].innerHTML }); } } if (cache1.length > 0) { for (let i = 0; i < cache1.length; i++) { // 输出时带上节号,格式可按需调整 resultEl.innerHTML += `[节${cache1[i].verse}] ${cache1[i].content}<br>`; } } else { resultEl.innerHTML = "未找到匹配内容"; } }
改动说明
- 新增
currentVerseNr全局跟踪当前节号,无论当前段落是否匹配关键词,只要遇到带节号的首行就更新该值,保证后续无节号的段落继承到正确的节号 - 结果数组从仅存文本改为存储对象,同时保留节号和内容,方便后续如果要对结果做分类、筛选等扩展操作
- 新增搜索前清空上次结果的逻辑,避免多次搜索结果叠加
- 新增无匹配结果的提示,展示格式可根据需求自行调整
内容的提问来源于stack exchange,提问作者rndusr
相关产品推荐
相关产品推荐

