检查span元素是否包含“text”,并且是父元素的最后一个子元素

时间:2013-09-16 10:50:56

标签: javascript jquery

我循环遍历属于"frag"类的span元素。我想检测片段元素当前是否在

  1. 的父级名称为'cond'
  2. 该父级包含文本“if”或“else if”
  3. 当前的frag是第1号和第2号资格的父级的最后一个子级
  4. (顺便说一句,我的系统就像一个代码编辑器,所以我使用的是一个可信的div) 在这里,我想检测一下b是否符合第1,2和3条的要求。

    contenteditable div (textarea)

    if( (b>3) && b<10)
    

    我做了什么不介意循环。我不知道如何构建条件。

    if( $('.frag').eq(ctr).parent().hasClass('cond') && /(?:if|else\s+if)/g.test$('.frag').eq(ctr).text() && $('.frag').eq(ctr).lastChildOfParent ) 
    

    HTML

    <div id="board">
      <div>
      <span class="frag cond">if <span class="openParen bm1">(</span> <span class="frag cond">(<span class="frag">b</span>&gt;3) </span> && <span class="frag">b</span>&lt;10 <span class="closeParen bm1">)</span></span>
      </div>
    </div>
    

    UPDATE1 :添加了()的span-wrap。这使)成为最后一个孩子。

    UPDATE2 :我对父母的意思是,它可以是直接的父母,祖父母或祖父母。因此,如果((b&gt; 3)&amp;&amp;((c&gt; 1)||(b&lt; 10))

    ,那么在可信任的div中的文本将不会出现问题。

    因为当我在最后一个b的片段中,我不会在我的直接父母中找到'if'或'else if'(b <10)

2 个答案:

答案 0 :(得分:2)

测试是否是最后一个孩子

$('.frag').eq(ctr).is(function(){
    var $this = $(this), fragsibs = $this.siblings('.frag').addBack();
    return fragsibs.last().is(this) && /^(if|else \s+if)/.test($this.text())
});

答案 1 :(得分:1)

你似乎有(1)和(2)确定,所以对于(3),尝试:

$elem.nextAll('.frag').length === 0

其中$elem是您正在测试的元素的jQuery对象。

请参阅:http://api.jquery.com/nextAll/

总的来说,你想要的东西是:

var $parent = $elem.parent();

if ($parent.hasClass('cond') && /^\s*(if|else\s+if)/.test($parent.text()) && !$elem.nextAll('.frag').length) {
    // do things
}

我唯一不确定的是正则表达式,因为我不是100%你想要的。我选择开始“if”或“else if if”。

更新:如果我了解您的更新,请尝试:

var validAncest = $elem.parents('.cond').filter(function(i){
    return /^\s*(if|else\s+if)/.test($(this).text());
});
// this finds all ancestors with class 'cond' and 
// whose containing text starts with 'if'/'else if'

if (validAncest.length && !$elem.nextAll('.frag').length) {
    // do things
}

更新2:如果你需要计算祖先中后代的深度,你可以使用:

function childDepth ($elem, $ancestor) {
    var generations = 0;

    while ($elem[0] && $elem[0] !== $ancestor[0]) {
        generations++;
        $elem = $elem.parent();
    }

    if ($elem[0]) {
        return generations;
    }
}

如果$ancestor$elem的父亲,则返回1;如果是祖父母等,则返回2;如果undefined实际上不是$ancestor的祖先,它将返回$elem