如何选择包含至少一个[attr = name1]元素的所有元素,而这些元素又包含至少一个[attr = name2]元素?

时间:2012-11-02 02:53:43

标签: jquery

我有这个标记:

<div class="click">click</div>
<div id="wrapper">
<div class="container">
<div data-attrfirst='type1'><span data-attrsecond='type2'>must be red</span></div>
</div>
</div>

我想选择所有.container: 1.在#wrapper内; 2.包含data-attrfirst='type1'元素,而该元素又包含data-attrsecond='type2'元素 我的要求:
1.我的'#wrapper','type1','type2'值必须保存为变量 2.我必须在某个标签内找到这一切(在这种情况下,我选择body)。

我尝试了这个(星号可能会删除,没有区别):

<script>
    $(document).ready(function () {
        $('.click').click(function () {
            var myid = '#wrapper';
            var attrfirst = 'type1';
            var attrsecond = 'type2';
            var elem = $('*[data-attrfirst=' + attrfirst + ']').has('*[data-attrsecond=' + attrsecond + ']');
            $('body').find(myid + ' .container').each(function (i) {
                if ($(this).has('*[data-attrfirst=' + attrfirst + '] *[data-attrsecond=' + attrsecond + ']')) {
                    $(this).css('color', 'red')
                }
            });

            $('body').find(myid + ' .container').each(function (i) {
                if ($(this).has(elem)) {
                    $(this).css('color', 'red')
                }
            });
            $('body').find(myid + ' .container').filter(function (i) {
                return $('*[data-attrfirst=' + attrfirst + '] *[data-attrsecond=' + attrsecond + ']', this).length >= 1
            }).css('color', 'red')
        });
    });
</script>

我哪里错了?我不明白Jquery文档,.has是否接受Jquery对象?

3 个答案:

答案 0 :(得分:1)

您的问题是要找到#container,请使用此选项:

$('body #wrapper .container:has([data-attrfirst="type1"] [data-attrsecond="type2"])');

或者,为了减少混乱,你可以倒退:

$('[data-attrfirst="type1"] [data-attrsecond="type2"]')
     .closest('body #wrapper .container');

但是,从您的代码中,您似乎确实希望找到最后一个data-attrsecond="type2"元素。在这种情况下,请使用:

$('body #wrapper .container [data-attrfirst="type1"] [data-attrsecond="type2"]');

答案 1 :(得分:0)

您正在尝试查找.container,但您已将'container'定义为id属性而非class属性。 #container应该返回您要查找的元素。

答案 2 :(得分:0)

这将有效:

attrfirst = 'type1';
attrsecond = 'type2';
thetag = 'body';

$(thetag + " #wrapper [data-attrfirst='" + attrfirst + "'] [data-attrsecond='" + attrsecond + "']").css('color', 'red')