2012-01-10 111 views
0

我有几个元素,其中一个元素可能有多个类名 - 其中一个是常见的。jQuery选择与其他元素的类名匹配的元素

如:

<div class='div1 someClassname someOtherClassname'></div> 
<div id='container'> 
    <div class='div1'> 
    </div> 
</div> 

所以,我有上.someClassname火灾,但我需要做一些与#container .div1的事件。我如何选择#container .div1,仅使用我可以从.someClassname中收集到的事件时发生事件?

下面是我用实验的那种东西:

$('.someClassname').click(function(){ 
    var classes = $(this).attr('class'); // 'div1 someClassname someOtherClassname' 
    var otherElem = $('#container').children().filter(classes); //empty jQuery object 
}); 

我真的不能解析的类名,因为我不知道我在寻找特定的类或类,我'm 不是寻找数字和名称更改取决于。

任何指针十分赞赏

+1

我说你在正确的轨道上。问题'过滤器'给出一个空的结果是你的类字符串由类名组成,但过滤器希望类选择符(带点)。 – Yoshi 2012-01-10 10:45:41

回答

4

试试这个

$('.someClassname').click(function(){ 
    var classes = $(this).attr('class').split(" ").join(",."); 
    alert(classes); 
    $('.'+classes).not(this).each(function(){ 
    alert($(this).text()); 
    }); 

}); 

小提琴:http://jsfiddle.net/3rVjN/

+0

多数民众赞成在相当优雅 - 这对我有效 – jammypeach 2012-01-10 10:51:13

1

如果我理解正确,你将需要使用的类split,并与点和逗号作为必要格式化您的选择。给它一个去,如果你还在努力,我会发布一些测试代码。

1

我觉得你差不多了。只需要.splitclasses var与,为每个数组元素添加.,然后将数组加回到,,以便您获得.div1, .otherclassname, etc.。你可以使用这个字符串作为你的选择器。

这假设你想要关于类的逻辑OR。否则(如果你想和),不要加入,,只需将元素粘在一起。

1

您不应该滥用此功能class

添加一个额外的属性,例如HTML5的data-target="div1".someClassName元素。

<div data-target="div1" class="div1 someClassname someOtherClassname"></div> 
<div id="container"> 
    <div class="div1"> 
    </div> 
</div> 

,然后在代码:

$('.someClassname').click(function() { 
    var target = $(this).data('target'); 
    var other = $('#container').children('.' + target); 
}); 

如果有与div1相关联,那么我就不会使用样式都表明没有实际的CSS样式,并把一个id标签上的目标DIV - 它会更快地按ID进行匹配,而不是按类进行匹配。

+0

我同意你 - 我使用jquery的'data()'方法来正常记录这种东西。然而我发现自己需要这样做,但仍然 – jammypeach 2012-01-10 10:48:47

+0

@jammypeach你不知道什么时候你创建的确切哪个“其他”类是“共同的”类吗? – Alnitak 2012-01-10 10:52:48

+0

是的,但是其中有36个,并且它们被编号 - 所以我正在寻找一种更好的方式来以编程方式确定要使用哪一个。他们也有风格相关 - 但我认为你可能是正确的,从最佳实践的角度来看,数据属性会更好。 – jammypeach 2012-01-10 10:56:50

1

这是你要找的代码:

$('.someClassname').click(function(){ 
    var classes = $(this).attr('class'); // 'div1 someClassname someOtherClassname' 

    var arr = classes.split(" "); 
    var filter = [];    

    $.each(arr, function(index, item){ 
     filter.push("."+item) 
    })      

    var filterStr = filter.join(",") 

    var otherElem = $('#container').children().filter(filterStr); 
});  

这个错误你有被认为是类类名的字符串。 jQuery的.filter()方法接受一个选择器。

2

你可以做这样的事情:

$('.someClassname').click(function(){ 
    var classes = $(this).attr('class').split(/\s+/); 
    $.each(classes , function(index, value) { 
     console.log($('#container').find("."+value)); 
}); 

}); 

sample

1

我也有类似的问题,前几天。这为我工作:

// all your element classes 
allClasses = $('yourElement').attr("class").split(/\s+/); 

// retrieve desired classes 
for (var j = 0; j < allClasses.length; j++) { 
    if (allClasses[j] === 'class1' || allClasses[j] === 'class2' || allClasses[j] === 'class3') { 
    classes = classes+" "+allClasses[j] 
    } 
    }   
console.log(classes) 

我用这个,如果我想拉class1,2,3出来的元素,它可以包含任意数量的与未知名类。

也许有帮助。

0

如果我正确理解你的问题,这应该帮助:

var classes = $(this).attr("class").split(/\s+/); 
var obj = $(); 
for (var i = 0; i < classes.length; i++) { 
    obj = obj.add($("#container ." + classes[i])); 
} 

现在OBJ应该包含你的对象