检测我当前所在的元素是否是元素的最小的儿子/孙子/ grandgrand之子

时间:2013-09-18 05:48:57

标签: javascript compiler-construction depth-first-search

我循环遍历属于frag类的span元素。我想检测我当前所处的frag元素是否是属于frag类且属于cond类且属于if( ((b>0) && (b<10)) || b==15 ) 类的span元素的最小的儿子/孙子/ grandgrand子(从左到右)在其文本中有“if”或“else if”

contenteditable div(textarea)

<div id="board">
  <div>
  <span class="frag cond">if<span class="openParen bm1">(</span> <span class="frag cond"><span class="openParen bm2">(</span><span class="frag cond"><span class="openParen bm3">(</span><span class="frag">b</span>&gt;0<span class="closeParen bm3">)</span></span> && <span class="frag cond"><span class="openParen bm4">(</span><span class="frag">b</span>&lt;10<span class="closeParen bm4">)</span></span><span class="closeParen bm2">)</span></span> || <span class="frag">b</span>==15 <span class="closeParen bm1">)</span></span>
  </div>
</div>

HTML等效

b

(顺便说一句,我的系统就像一个代码编辑器,所以我使用的是一个有意义的div)在这里,我想检测一下我是否在3 var $elem = $('.frag').eq(fragNum); var validAncest = $elem.parents('.cond').filter(function(i){ return /^\s*(if|else\s+if)/.test($(this).text()); }).filter(function(i){ var generations = 0, $elemCrawl = $('.frag').eq(fragNum); while ($elemCrawl[0] && $elemCrawl[0] !== this) { generations++; $elemCrawl = $elemCrawl.parent(); } if ($elemCrawl[0] && generations < 4) { return true; } });

byossarian帮助了我:

if (validAncest.length && !$elem.nextAll('.frag').length) {
    alert('target acquired');
}

找到元素的所有祖先,然后过滤一次以缩小到以'if'或'else if'开头的那些。然后将它们过滤到原始元素的父,祖父母或曾祖父母(代数&lt; 4)的那些。

要检查的条件是:

b

它检查至少有一个有效的祖先(validAncest.length)并且原始元素是其 IMMEDIATE parent 的最后一个孩子,它具有“frag”类(!$ elem。 nextAll( 'FRAG')。长度)

问题

IMMEDIATE父也应该是元素的最后一个子/孙,带有“if”或“else if”

因此,从上面的示例中,第一个b已经提醒我应该在3日b

更新应在第二个(b<10)而非{{1}}

处弹出提醒

enter image description here

1 个答案:

答案 0 :(得分:1)

尝试使用以下内容更改validAncest

var validAncest = $elem.parents('.cond').filter(function(i){
    return /^\s*(if|else\s+if)/.test($(this).text());
}).filter(function(i){
    var generations = 1,
    $elemCrawl = $('.frag').eq(fragNum).parent();

    while ($elemCrawl[0] && $elemCrawl[0] !== this) {
        if (!$elemCrawl.is(':last-child')) {return false;}
        generations++;
        $elemCrawl = $elemCrawl.parent();
    }

    if ($elemCrawl[0] && generations < 4) {
        return true;
    }
});

这应包括:

  1. $ elem的父母提供它以'if'/'else if'
  2. 开头
  3. 祖父母提供的开头是'if'/'else if'和$ elem的父母是这个祖父母的最后一个孩子
  4. 曾祖父母提供的开头是“if”/“else if”和$ elem的父母是中间祖父母的最后一个孩子,祖父母是祖父母的最后一个孩子