【问题标题】:Detect if the element im currently in is the youngest son/grandson/grandgrand son of an element检测我当前所在的元素是否是元素的最小儿子/孙子/孙子
【发布时间】:2013-09-18 05:48:56
【问题描述】:

我正在循环属于 frag 类的 span 元素。我想检测我当前所在的 frag 元素是否是属于frag 类和属于cond 类并且具有“如果" 或 "else if" 在其文本中

内容可编辑的 div(文本区域)

if( ((b>0) && (b<10)) || b==15 )

HTML 等效项

<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>

(顺便说一下,我的系统就像一个代码编辑器,所以我使用的是可内容编辑的 div)在这里,我想检测我是否在 3 号 b

byossarian 帮我解决了这个问题:

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;
    }
});

找到元素的所有祖先,然后过滤一次以缩小以'if'或'else if'开头的那些。然后,它将这些过滤为原始元素的父、祖父母或曾祖父母(世代

要检查的条件是:

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

它检查至少有一个有效的祖先 (validAnncest.length) 并且原始元素是它的 IMMEDIATE parent 的最后一个子元素,该子元素具有类 'frag' (!$elem. nextAll('.frag').length)

问题

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

所以从上面的例子来看,第一个 b 已经给了我警报,第三个 b 应该在哪里

UPDATE应该在第二个b而不是(b&lt;10)弹出警报

【问题讨论】:

  • 当你说“直系父母也应该是最后一个......孙子”时,最后一个孙子是什么意思?你的意思是它的父母的最后一个孩子,还是最后一个孩子的最后一个孩子?
  • 最后一个孩子的最后一个孩子
  • 如果 .frag 元素的直接父元素是开头带有 'if'/'else if' 的元素,大概没问题?
  • 你的意思是 if(b>0 && b

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


【解决方案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. 如果祖父母以 'if'/'else if' 开头并且 $elem 的父母是此祖父母的最后一个孩子
  3. 曾祖父母以“if”/“else if”开头且 $elem 的父母是中间祖父母的最后一个孩子并且该祖父母是曾祖父母的最后一个孩子

【讨论】:

  • 具有: "if( (b>0) && (b
  • @extraRice 我只是检测到最后一个'b':jsfiddle.net/BYoassrian/fNYzh
  • 它与我的 HTML 完全相同,对吧?嗯,它可能在我身边.. 谢谢
  • @extraRice 是的,我刚刚复制并粘贴到 JSFiddle 中。
  • 我想提醒包含 ang if 或 else if 的目标片段的父级,该怎么做?
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多