我循环遍历属于"frag"
类的span元素。我想检测片段元素当前是否在
(顺便说一句,我的系统就像一个代码编辑器,所以我使用的是一个可信的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>>3) </span> && <span class="frag">b</span><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)
答案 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
。