首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML页面搜索

HTML页面搜索
EN

Stack Overflow用户
提问于 2016-08-03 01:42:11
回答 1查看 212关注 0票数 2

我有一个非常长的html文件(20K+行),我想要有一个搜索,它将找到搜索词,然后滚动到li class="page" data-name="XX"。如果找到该术语的多个实例,我们需要一个“下一步”结果按钮。

下面是我想要搜索的HTML文件的摘录:

代码语言:javascript
复制
  <li class="page" data-name="11">
<div class="pageResizer" style="width:640px;height:960px;">&nbsp;</div>
<div id="item690" class="pageItem" alt="Rectangle">&nbsp;</div>
<div id="item728" class="pageItem" alt="Rectangle">&nbsp;</div><button class="pageItem" alt="Home" id="item1426" data-id="1426" onclick="nav.to(5);">&nbsp;</button><button class="pageItem" alt="prevBtn" id="item1423" data-id="1423" onclick="nav.back(this);">&nbsp;</button><button class="pageItem" alt="nextBtn" id="item2550" data-id="2550" onclick="nav.next(this);">&nbsp;</button><img src="assets/images/blank.gif" class="pageItem" alt="Rectangle" style="left:491px;top:11px;" data-src="assets/images/item_2757.png"/>
<div id="item2788" class="pageItem singleline" alt="Lafayette Chamber">
  <p class="autoParaStyle1">Lafayette Chamber</p>
</div><button class="pageItem" alt="Share" id="item3136" data-id="3136">&nbsp;</button>
<a href="javascript:nav.to(2);"><button class="pageItem" alt="Help" id="item2977" data-id="2977" onclick="nav.to(2);">&nbsp;</button>
</a><img src="assets/images/blank.gif" class="pageItem" alt="Rectangle" style="left:1px;top:66px;" data-src="assets/images/item_4899.jpg"/><img src="assets/images/blank.gif" class="pageItem" alt="Rectangle" style="left:1px;top:707px;" data-src="assets/images/item_4901.jpg"/>
<div id="item4906" class="pageItem singleline" alt="lafayETTE ">
  <p class="autoParaStyle13">lafayETTE<br />
  </p>
</div>
<div id="item4937" class="pageItem singleline" alt="HISTORY">
  <p class="autoParaStyle14">HISTORY</p>
</div>
<div id="item4982" class="pageItem" alt=" little more than a century ago, the first pioneers trickled into this region after a long journey across the Great P...">
  <p class="Article-Body"> <span class="autoCharStyle5">little more than a century ago, the first pioneers trickled into this region after a long journey across the Great Plains.  The gold rush attracted more and more adventurous fortune seekers who were closely followed by other settlers.  The honeymoon of Lafayette and Mary E. Miller was spent crossing the plains and arriving in the Boulder region.  In 1863, they started farming the Burlington (Longmont) area and soon moved south and settled in the present site of Lafayette.  Lafayette Miller was an industrious man and besides farming, he operated the stage stop and ran several meat markets.  His sudden death in 1878 left Mary Miller with six small children to raise.  She did this and more…she raised a town!<br /></span>      </p>
  <p class="autoParaStyle8"><br /></p>
</div>
<div id="item27143" class="pageItem singleline" alt="A">
  <p class="autoParaStyle15">A</p>
</div>

以下是我到目前为止拥有的代码:

代码语言:javascript
复制
<script>
function search() {

var name = document.getElementById("searchForm").elements["searchItem"].value;
var pattern = name.toLowerCase();
var targetId = "";

var divs = document.getElementsByClassName("page");
for (var i = 0; i < divs.length; i++) {
  var para = divs[i].getElementsByTagName("p");
  var index = para[0].innerText.toLowerCase().indexOf(pattern);
  if (index != -1) {
     targetId = divs[i].parentNode.id;
     document.getElementById(targetId).scrollIntoView();
     break;
  }
}  
}
</script>

<form id="searchForm" action="javascript:search();">
<div class="input-group">
  <button id="go"  type="button" 
          onclick="document.getElementById('searchForm').submit(); return false;">
  Search</button>
  <input type="text" id="searchItem" class="form-control" placeholder="Search" cols="50" rows="2">
</div>
</form>

我不确定我需要对我的代码做什么才能让它工作,也不知道如何制作一个“下一个结果”按钮。

EN

回答 1

Stack Overflow用户

发布于 2016-08-03 05:58:19

我想这就是你要找的:

HTML:

代码语言:javascript
复制
<body>
  <form id="searchForm" action="javascript:search();" class="form">
    <button id="nextButton" onclick="nextItem()" type="button" class="make-invisible">NEXT</button>
    <div class="input-group">
      <button id="go">Search</button>
      <input type="text" id="searchItem" name="searchItem" class="form-control" placeholder="Search" cols="50" rows="2">
    </div>
  </form>
  <ul>
    <li class="page" data-name="foo">Has data-name = foo</li>
    <li class="page" data-name="foo">Has data-name = foo</li>
    ...
  </ul>
</body>

JavaScript:

代码语言:javascript
复制
var selectedItems;
var currentlySelectedItem;
var makeInvisibleClassName = "make-invisible";
var nextButton = document.querySelector("#nextButton");

function search() {
  makeInvisible();
  var searchPhrase = document.querySelector("#searchItem").value;
  selectedItems = document.querySelectorAll(".page[data-name='" + searchPhrase + "']");
  if (selectedItems.length === 0) {
    return;
  }
  if (selectedItems.length > 1) {
    makeVisible();
  }
  currentlySelectedItem = 0;
  nextItem();
}

function nextItem() {
  selectedItems[currentlySelectedItem].scrollIntoView();
  currentlySelectedItem++;
  if (currentlySelectedItem >= selectedItems.length) {
    currentlySelectedItem = 0;
  }
}

//////////
function makeInvisible() {
  nextButton.classList.add(makeInvisibleClassName);
}

function makeVisible() {
  nextButton.classList.remove(makeInvisibleClassName);
}

CSS:

代码语言:javascript
复制
.form {
  position: fixed;
  left: 0;
  top: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  width: 100%;
}

#nextButton {
  margin-right: 10px;
}

.make-invisible {
  display: none;
}

下面是有效的Demo

好的,让我解释一下我在这里做了什么。

当你有一个表单时,你实际上不需要这样做:

代码语言:javascript
复制
<button id="go" type="button" onclick="document.getElementById('searchForm').submit(); return false;">

相反,您可以使用非常简单的方法:

代码语言:javascript
复制
<button id="go">Search</button>

表单中的默认按钮类型是type="submit",它会自动触发action属性中指定的事件。

下一步是下一步按钮。我对它进行了硬编码,为了显示和隐藏它,我将添加或删除类make-invisible。请注意,按钮在开始时是不可见的。它还有一个将触发nextItem()的单击事件

代码语言:javascript
复制
<button id="nextButton" onclick="nextItem()" type="button" class="make-invisible">NEXT</button>

我还创建了两个全局变量:selectedItemscurrentlySelectedItem,前者将存储所选项目的数组,后者具有当前滚动到项目的索引。

search()函数获取类名为page且具有带有指定单词的属性data-name的所有元素。然后,它检查是否有多个结果。如果是这样,它将使该按钮可见。

nextItem()函数滚动到选定的元素,并将索引递增1。如果索引值大于匹配的元素,则会开始循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38727135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档