【问题标题】:Find text string using jQuery?使用jQuery查找文本字符串?
【发布时间】:2010-10-29 22:06:06
【问题描述】:

假设一个网页有一个字符串,例如“我是一个简单的字符串”,我想找到它。我将如何使用 JQuery 来解决这个问题?

【问题讨论】:

    标签: jquery text


    【解决方案1】:

    jQuery 有 contains 方法。这是给你的sn-p:

    <script type="text/javascript">
    $(function() {
        var foundin = $('*:contains("I am a simple string")');
    });
    </script>
    

    上面的选择器选择包含目标字符串的任何元素。 foundin 将是一个包含任何匹配元素的 jQuery 对象。参见 API 信息:https://api.jquery.com/contains-selector/

    使用“*”通配符需要注意的一点是,您将获得所有元素,包括您的 html 和 body 元素,这可能是您不想要的。这就是为什么 jQuery 和其他地方的大多数示例都使用 $('div:contains("I am a simple string")')

    【讨论】:

    • @Tony,我将如何处理匹配的文本,而不仅仅是整个段落、div 等?
    • 应该指出这是区分大小写的。一个名为“me”的用户在 jQuery 文档页面上写了这个: $.expr[':'].icontains = function(obj, index, meta, stack){ return (obj.textContent || obj.innerText || jQuery( obj).text() || '').toLowerCase().indexOf(meta[3].toLowerCase()) >= 0; };示例:$("div:icontains('John')").css("text-decoration", "underline");
    • 这对 json 有效吗?如果我想过滤 json 值中的一些文本怎么办?
    • 如果文本节点有换行符,这将不起作用,例如。 “我是一个简单的\n 字符串”。请注意,不会呈现换行符,因此用户甚至不知道问题出在哪里。所有这些解决方案都有这个问题。见jsfiddle.net/qPeAx
    • -1,不起作用。它返回树中的所有父节点,您只需要最低的一个。
    【解决方案2】:

    通常 jQuery 选择器不会在 DOM 中的“文本节点”内进行搜索。但是如果使用 .contents() 函数会包含文本节点,那么可以使用 nodeType 属性仅过滤文本节点,使用 nodeValue 属性搜索文本字符串。

    $('*', '正文') .andSelf() 。内容() .filter(函数(){ 返回 this.nodeType === 3; }) .filter(函数(){ // 仅当文本中任何位置包含“简单字符串”时才匹配 return this.nodeValue.indexOf('simple string') != -1; }) .每个(函数(){ // 用 this.nodeValue 做点什么 });

    【讨论】:

    • 澄清一下,正如 Tony 提到的,您可以使用 ":contains()" 选择器在文本节点中搜索,但 jQuery 不会在结果中返回单个文本节点(只是元素列表)。但是当你使用 .contents() 时,jQuery 会返回元素和文本节点。欲了解更多信息:docs.jquery.com/Traversing/contents
    • 我对你为什么使用.andSelf() 感到困惑。来自api.jquery.com/andSelf:“jQuery 对象维护一个内部堆栈,用于跟踪匹配的元素集的更改。当调用 DOM 遍历方法之一时,新的元素集被推入堆栈。如果前一组元素也是需要的,.andSelf() 可以提供帮助。”我没有看到以前的上下文,我错过了什么?
    • 点赞!应该是公认的答案,因为它会过滤掉我认为在大多数情况下常见的所有父节点。
    【解决方案3】:

    这将只选择包含“I am a simple string”的叶子元素。

    $('*:contains("I am a simple string")').each(function(){
         if($(this).children().length < 1) 
              $(this).css("border","solid 2px red") });
    

    将以下内容粘贴到地址栏中进行测试。

    javascript: $('*:contains("I am a simple string")').each(function(){ if($(this).children().length < 1) $(this).css("border","solid 2px red") }); return false;
    

    如果你只想获取“我是一个简单的字符串”。首先将文本包装在这样的元素中。

    $('*:contains("I am a simple string")').each(function(){
         if($(this).children().length < 1) 
              $(this).html( 
                   $(this).text().replace(
                        /"I am a simple string"/
                        ,'<span containsStringImLookingFor="true">"I am a simple string"</span>' 
                   )  
               ) 
    });
    

    然后执行此操作。

    $('*[containsStringImLookingFor]').css("border","solid 2px red");
    

    【讨论】:

    • 这里的 .filter() 函数会比 .each() 更有用。事实上,你实际上可以把它放在一个选择器中:“*:contains('blah'):empty”
    • #nickf - :empty 不会选择包含文本的文本节点。因此,如果文本节点包含“我是一个简单的字符串”,它将被排除在外。 docs.jquery.com/Selectors/empty
    • 我知道我来晚了,但这不会忽略字符串存在于顶层但其中有子级的任何文本块吗?例如:
      我是一个简单的字符串生活在边缘
    • 我只想提一下“containsStringImLookingFor”不是一个有效的 HTML 属性。请用于 HTML 5“data-containsStringImLookingFor”。早于 5 的 HTML 版本无法添加自定义属性...
    【解决方案4】:

    如果您只想要最接近您正在搜索的文本的节点,您可以使用:

    $('*:contains("my text"):last');
    

    如果你的 HTML 看起来像这样,这甚至可以工作:

    <p> blah blah <strong>my <em>text</em></strong></p>
    

    使用上面的选择器将找到&lt;strong&gt; 标签,因为这是包含整个字符串的最后一个标签。

    【讨论】:

    • 这似乎不起作用。例如,在此页面上,*:contains("the"):last 仅返回 1 个元素。
    • @bzlm:嗯,它不一定指定他想找到多个匹配项。
    • 啊哈。有没有办法让它适用于多次出现?我认为这是一个比涉及递归节点类型检查等更优雅的解决方案。
    • 我能想到的唯一方法是获取所有节点,但不是所有的祖先都会循环遍历结果,删除所有父节点,尽管你可能会遇到问题,例如:@ 987654324@ -- 删除&lt;b&gt;标签的祖先会丢失另一个匹配
    【解决方案5】:

    看看highlight(jQuery插件)。

    【讨论】:

      【解决方案6】:

      只是添加到托尼米勒的答案,因为这让我对我正在寻找的东西有 90% 的了解,但仍然没有工作。在他的代码末尾添加.length &gt; 0; 可以让我的脚本正常工作。

       $(function() {
          var foundin = $('*:contains("I am a simple string")').length > 0;
       });
      

      【讨论】:

      • 如何在找到的字符串上附加一个新单词?,我想在找到的工作上添加一个星号。
      • @SaMolPP foundin += '*';
      【解决方案7】:

      这个功能应该可以工作。基本上是进行递归查找,直到我们得到一个不同的叶节点列表。

      function distinctNodes(search, element) {
          var d, e, ef;
          e = [];
          ef = [];
      
          if (element) {
              d = $(":contains(\""+ search + "\"):not(script)", element);
          }
          else {
                  d = $(":contains(\""+ search + "\"):not(script)");
          }
      
          if (d.length == 1) {
                  e.push(d[0]);
          }
          else {
              d.each(function () {
                  var i, r = distinctNodes(search, this);
                  if (r.length === 0) {
                      e.push(this);
                  }
                  else {
                      for (i = 0; i < r.length; ++i) {
                          e.push(r[i]);
                      }
                  }
              });
          }
          $.each(e, function () {
              for (var i = 0; i < ef.length; ++i) {
                  if (this === ef[i]) return;
              }
              ef.push(this);
          });
          return ef;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-21
        • 1970-01-01
        • 2011-10-11
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        相关资源
        最近更新 更多