【问题标题】:JQuery search in static page of links with highlighting of found word without breaking listJQuery在链接的静态页面中搜索,突出显示找到的单词而不破坏列表
【发布时间】:2016-08-06 02:10:55
【问题描述】:

在之前看过这个帖子之后,JQuery search in static HTML page with highlighting of found word,我终于找到了我要找的东西。但是,搜索似乎破坏了其他 HTML 标记。我知道它不适合我的确切要求,但我正在寻求帮助。

这是一个 HTML 示例:

$('#searchfor').keyup(function(){
  var page = $('#all_text');
  var pageText = page.text().replace("<span>","").replace("</span>");
  var searchedText = $('#searchfor').val();
  var theRegEx = new RegExp("("+searchedText+")", "igm");    
  var newHtml = pageText.replace(theRegEx ,"<span>$1</span>");
  page.html(newHtml);
});
#all_text span {
  text-decoration: underline;
  background-color: yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<input type="text" id="searchfor" />
<ul id="all_text">
  <li><a href="/somewhere">Somewhere</a></li>
  <li><a href="/somewhere-else">Over there</a></li>
</ul>

在搜索框中输入后,它会删除所有&lt;li&gt; 标签和所有&lt;a&gt; 标签。我对 Javascript 或 Jquery 不是很有信心,所以我无法自己解决这个问题。它需要保留列表和超链接,但只在可见文本中搜索(即不在href字段中搜索)。

非常感谢所有输入。

【问题讨论】:

  • 试试bartaz.github.io/sandbox.js/jquery.highlight.html或类似的插件(谷歌提供一些)
  • 谢谢@MoshFeu。设法让它与您的建议相符。
  • Mosh Feu 推荐的插件没有维护(最后一次提交是从 2010 年开始),在 GitHub 上禁用了问题,并且不会重新定位到原始插件(落后 2 个版本)。使用它时应该非常小心。相反,请查看mark.js

标签: javascript jquery html


【解决方案1】:

所以我认为解决您的问题的方法是您只需要获取要突出显示的锚点的内容。下面是 jsfiddle:https://jsfiddle.net/kimaescobar/k83j7Lqv/1/ 但基本上我在可搜索的锚点中创建了一个类,而不是在 all_text 中获得所有可搜索的内容:

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<input type="text" id="searchfor" />
<ul id="all_text">
  <li><a class="searchable" href="/somewhere">Somewhere</a></li>
  <li><a class="searchable" href="/somewhere-else">Over there</a></li>
</ul>

css

#all_text em {
  text-decoration: underline;
  background-color: yellow;
}

JS

$('#searchfor').keyup(function(){
  var $page = $('#all_text .searchable');
  $page.each(function(i,a){
        $a = $(a)
      $a.html($a.html().replace(/<em>/g,"").replace(/\<\/em\>/g,""))
    })
  var searchedText = $('#searchfor').val();
  if(searchedText != ""){
    $page.each(function(i,a){
      $a = $(a)
      var html = $a.text().replace(new RegExp("("+searchedText+")", "igm"), "<em>$1</em>")
      $a.html(html)
    })
  }
});

obs:我从 span 更改为 em,因为在 html5 中,当您想要突出显示某些内容时,您使用 strong 或 em(取决于您想要的语义)。

【讨论】:

  • 我已经编辑了你的帖子,请看一下。这是我编辑的jsfiddle
【解决方案2】:

因为我的编辑被拒绝了。不完全确定为什么,但他的代码可以精简很多。这是我的编辑:

所以我认为解决您的问题的方法是您只需要获取要突出显示的锚点的内容。下面是 jsfiddle:jsfiddle。基本上,我以锚标签为目标,并使用.each() 函数根据用户搜索的内容替换每个锚标签中的内容。

api documentation for .each
javascripts replace function

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
<input type="text" id="searchfor" />
<ul id="all_text">
  <li><a href="/somewhere">Somewhere</a></li>
  <li><a href="/somewhere-else">Over there</a></li>
</ul>

css

#all_text span {
  text-decoration: underline;
  background-color: yellow;
}

JS

$('#searchfor').keyup(function(){
  var $page = $('#all_text a');

  var searchedText = $('#searchfor').val();

    $page.each(function(i,a){
      $a = $(a);
      $a.html($a.html().replace(/<span>/g,"").replace(/\<\/span\>/g,""));
      var html = $a.text().replace(new RegExp("("+searchedText+")", "igm"), "<span>$1</span>");
      $a.html(html);
    });
});

【讨论】:

  • 我知道。被3/5人拒绝,2/5人同意。拒绝的原因是:“这个编辑偏离了帖子的初衷。即使是必须做出大刀阔斧的编辑,也应该努力保持帖子所有者的目标。”我不认为它偏离了帖子的初衷。唯一的区别是我使用了span 而不是em。否则它只是你代码的精简版。
  • 伙计,我没有看到你的编辑我没有机会批准或拒绝它:/对此我很抱歉。我不知道谁有权拒绝该版本。
  • 不用担心。我只是想张贴以表明有另一种/精简的方式来解决您的答案。
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多