考虑以下HTML:

<div class="foo" id="obj">
   I should be changed red
   <div class="bar" style="color:black;">
      I should not be changed red.
      <div class="foo">I should be changed red.</div>
   </div>
</div>

由于DOM元素obj和表达,我该如何去选择任何儿童,并可能obj?我正在寻找类似“选择后裔”,而且还包括父,如果它的表达式匹配。

var obj = $("#obj")[0];

//wrong, may include siblings of 'obj'
$(".foo", $(obj).parent()).css("color", "red");

//wrong -- excludes 'obj'
$(".foo", obj).css("color", "red");

//correct way, but it's annoying
var matches = $(".foo", obj);
if ($(obj).is(".foo")) matches = matches.add(obj);
matches.css("color", "red");

是否有一个更好的解决方案,以本?

有帮助吗?

解决方案

如果我理解正确:

$(currentDiv).contents().addBack('.foo').css('color','red');

我改名为清楚起见,“分区”到“currentDiv”。这将选择当前元素和它包含的所有元素,然后过滤出不具有类foo的那些和风格适用于余数,即,做有类foo的那些。

修改:一种轻微优化

$(currentDiv).find('.foo').addBack('.foo').css('color','red');

修改

此答案已更新,其中包含较新的jQuery方法。它最初是

$(currentDiv).find('.foo').andSelf().filter('.foo').css('color','red');

,其仍然需要jQuery的年龄大于1.8

其他提示

1.8的jQuery引入 .addBack()时,这需要一个选择器,有利于.andSelf(的)。因此,tvanfosson的代码变得更加有效,因为

$(currentDiv).find(".foo").addBack(".foo").css("color", "red");

如果你没有这个,我觉得

$(currentDiv).find(".foo").add(currentDiv.filter(".foo")).css("color", "red");

将是非常有效的,如果不是很漂亮。

安德鲁的答案是非常有用和最有效的所有问题的答案(从jQuery的1.8起),所以我做了如萨姆的建议,把它变成一个微不足道的jQuery扩展方法所有人使用:

扩展码:

jQuery.fn.findAndSelf = function (selector){
    return this.find(selector).addBack(selector);
};

使用这样的:

$(function(){
    $('#obj').findAndSelf('.foo').css('color', 'red');
});

的jsfiddle: http://jsfiddle.net/BfEwK/

充分肯定安德鲁暗示addBack()是最佳选择(如在此日期)。已经相应upvoted他,并建议大家这样做。

除非有更好的解决方案,我创建了一个新的功能,并使用它,而不是$:

var _$ = function(expr, parent){ 
   return $(parent).is(expr) ? $(expr, parent).add(parent) : $(expr, parent); 
}

如果我没有记错的话你能不能只是做以下?

$("#obj").css("color", "red").find(".foo").css("color", "red");

查找意图对象/元素应用CSS,然后找到所有对象/内的元件与所述所述选择的对象/元素,然后应用CSS来是呢?

一个更短的方式来选择的所有的派生元素,包括父元素:

$('*', '#parent').addBack();

哪些是一样的:

$('#parent').find('*').addBack();

$('*', '#parent').addBack().css('border', '1px solid #f00');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="parent">
  <span>Child</span>
  <span>Another child</span>
</div>

当然,可以通用选择更改为所需的元件。

$('.foo', '#parent').addBack();

$('#parent').find('.foo').addBack();

这难道不是你想要做什么(除非我误解...)

$(document).ready(function(){
    $("div.foo").css("color", "red");
});
 $('div.foo, div.foo > *').css('color','red');

的主要思想是,可以分开不同的规则通过逗号来匹配。就像在CSS。据我知道的一切 是的jQuery supoprted,可以是“或运算“由逗号分隔。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top