jQuery确定匹配的类是否具有给定的id


95

jQuery具有与以下语句等效的ID是什么?

$('#mydiv').hasClass('foo')

因此您可以提供一个类名,并检查它是否包含提供的ID。

就像是:

$('.mydiv').hasId('foo')

我想将样式应用于某个div。例如,在加载时,将显示所有带有foo类的东西,但我可能想关闭一个具有bar标识的foo类的实例。
Nicholas Murray

1
然后,$('#bar.foo').toggle();您将只需要一个ID,因为它们对于文档是唯一的。如果您只想在该ID为类的情况下切换该ID,foo则只需将该类添加到ID选择器即可。如果选择器找到一个空集,则什么也不会发生;如果选择器找到一个带有结果的集(其中只有一个),则它将切换元素。我认为你想得太多。
prodigitalson

3
只是说令人沮丧的是,人们说“你为什么要这么做?” 当我现在尝试这样做时。hasClass的问题是,如果与选择器匹配的ANY元素具有给定的类,则它将返回True。因此,在我有很多带有“蛋糕”类和每个其他类名(“一个”,“两个”等)的p的地方,我遇到了问题。我想选择p.cake的常规集合,然后有条件(如果class =“ one”-$ var = 23-等)。关键是我试图根据附加的类名传递不同的$ var。我正在尝试不必重复全部操作
Stella

Answers:


171

您可以通过组合多个选择器将该逻辑烘焙到选择器中。例如,我们可以定位具有给定id的所有元素,这些元素也具有特定的类:

$("#foo.bar"); // Matches <div id="foo" class="bar">

这看起来应该类似于您在CSS中编写的内容。请注意,它不适用于所有#foo元素(尽管应该只有一个),也不适用于所有.bar元素(尽管可能有很多)。它只会引用同时符合这两个属性的元素。

jQuery还有一个很棒的.is方法,可以让您确定元素是否具有一定的品质。您可以针对字符串选择器,HTML元素或另一个jQuery对象测试jQuery集合。在这种情况下,我们将仅针对字符串选择器进行检查:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'

32
为+1 is()。应该有一个.hasId()选择器,只是因为它似乎.hasClass()确实是一个明显的伙伴……
Matt Fletcher

43

我可能会用$('.mydiv').is('#foo');那就是说,如果您知道Id,为什么不首先将其应用于选择器?


17
也许代码正在进入一个回调函数,该回调函数需要以不同方式处理某种情况。因此,该函数会自动传递带有未知属性的jQuery对象。在这种情况下,$('your answer')。is('helpful');
彼得G

1
我可以想到许多原因。如果您想应用特定于移动设备的设置,例如元素具有id =“ mobile”,该怎么办。为什么不重要。
放置

好吧,只有一个元素应该有给定的,id否则应该是其他属性...我想如果所讨论的元素的结构位置基于页面或客户端/用户代理而变化,那么还可以,但是除此之外。 。
prodigitalson

19

更新:很抱歉误解了问题,删除了.has()答案。

另一种替代方法,创建.hasId()插件

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>


5
抱歉,但我认为您对这个问题的理解是错误的:has()API报告此问题:将匹配元素的集合减少为那些后代与选择器或DOM元素匹配的元素。OP正在询问如何测试类“ myDiv”的元素是否也具有Id foo,而has()将查找具有ID“ foo”的“ myDiv”的后代。
2014年

7

假设您要遍历一些DOM对象,并且想要查找并捕获具有特定ID的元素

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

您可以写一些类似的内容

$('#myDiv').find('#bar')

请注意,如果要使用类选择器,则find方法将返回所有匹配的元素。

或者您可以编写一个迭代函数来完成更高级的工作

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

可以为类选择器轻松修改相同的代码。

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

我很高兴您使用index()解决了您的问题,对您有用的东西。希望对其他有相同问题的人有所帮助。干杯:)


4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });

每个都是不需要的,因为永远不会超过一个#theMysteryId
prodigitalson

2
好吧,它免除了您将其分配给变量,检查长度是否为非空以及随后进行代码的麻烦。如果选择器不匹配,则jQuery不会调用“每个”函数,因此它很干净。现在,如果您只想调用一些jQuery API,就可以了。
尖尖的2010年

4

只是说我最终使用index()解决了这个问题。

似乎没有其他工作。

因此,对于同级元素而言,如果您首先按一个公共类进行选择,然后又想为每个特定类修改一些内容,那么这是一个很好的解决方法。

编辑:对于那些不知道(像我一样)的人,index()给出与选择器匹配的每个元素的索引值,从0开始计数,具体取决于它们在DOM中的顺序。只要知道class =“ foo”有多少个元素,就不需要id。

显然,这并不总是有帮助,但有人可能会发现它有用。



1

您还可以通过以下方式检查是否使用了id元素:

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

我将这种方法用于全局数据表和特定的有序数据表


undefined应该用引号引起来才能像'undefined'一样工作
Leo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.