【问题标题】:Jquery tranversing DOM to find consecutives valuesjquery遍历DOM查找连续值
【发布时间】:2010-12-07 11:13:03
【问题描述】:

感谢您的关注,所有有用的答案都已投票。 这是我的标记。我正在尝试查找 2 个连续的 div cmk1 and cmk2,其内容为 RIGHTHERE 以连续顺序排列。

  • div id 1 不应该匹配,因为有 right 但没有 here
  • div id 3 不应该匹配,因为有 here 但没有 right
  • 我正在尝试查找类似于div id 2 的内容,其中right 后跟here。此外,文本必须准确:<div>more than right</div> 不应匹配,即使它包含单词 right

最有效的方法是什么?

更新:我刚刚有个想法,我可以找到eachclass=cmk1。如果它匹配正确,我可以选择它的next (cmk2),如果它也匹配,这就是我要找的。但是如何在 jquery 中执行 while 循环?最重要的是我该如何退出?

<div class="sep" id="1">
  <div class="cmk1">right</div>
  <div class="cmk2">valc</div>
  <div class="opp">vald</div>   
  <a class="go">Go</a>                  
</div>
<div class="clear">
<div class="sep" id="12">
  <div class="cmk1">RIGHT</div>
  <div class="cmk2">HERE</div>
  <div class="opp">vala</div>   
  <a class="go">Go</a>                  
</div>
<div class="clear">
<div class="sep" id="59">
  <div class="cmk1">vale</div>
  <div class="cmk2">valf</div>
  <div class="opp">here</div>   
  <a class="go">Go</a>                  
</div>
<div class="clear">

【问题讨论】:

    标签: javascript jquery dom jquery-selectors traversal


    【解决方案1】:
    $('div.sep > div').each(function() {
        if($(this).text() == 'RIGHT') {
            if($(this).next('div').text() == 'HERE') {
                alert('Values occur consecutively in div id: ' +  $(this).parent().attr('id'));
                return false;            
            }
        }
    });
    

    我基本上遍历了每个 .sep div 的所有子 div 并测试了第一个单词。如果匹配,则可以通过next判断下一个div是否包含第二个单词。

    【讨论】:

    • 这会遍历每一个。一旦我找到了正确的,我该如何打破,这样我就不必继续旋转我的轮子了:)
    • @Chris - 我已编辑,只需返回 false 即可跳出循环。
    • 做得很好,但我认为$('.sep .cmk1') 是一个更合适的选择器(选择的节点更少且不依赖于标签)。
    • @Justin Johnson - 我同意你的观点,我只是不知道缩小选择范围,因为我不确定 OP 到底在寻找什么(例如,第一个词可以在.cmk2?)。无论如何,你的评论是最有帮助的。
    • @chris - html() 为您提供指定标签内的原始 html,而 text() 将为您提供所有包含的 HTML 的组合文本内容。
    【解决方案2】:
    $(':contains(RIGHT) :contains(HERE)')
    

    【讨论】:

    • 实际上它不仅要包含,还要完整的东西是平等的。例如,如果我正在寻找字符串 partial&lt;div&gt;partial&lt;/div&gt; 应该匹配 true,但 &lt;div&gt;Some partial content&lt;/div&gt; 不应该匹配。
    【解决方案3】:

    试试:

    $(':contains(right), :contains(here)')
        .filter( function() {
            return ( $(this).text() == 'right' && $(this).next().is(':contains(here)') ) ||
                ( $(this).text() == 'here' && $(this).prev().is(':contains(right)') );
        } );
    

    唯一的缺点是区分大小写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2016-09-22
      相关资源
      最近更新 更多