jQuery Determine se uma classe combinada tem um determinado id

95

O que é jQuery has id equivalente à seguinte instrução?

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

então você poderia dar um nome de classe e verificar se ela contém um id fornecido.

algo como:

$('.mydiv').hasId('foo')
Nicholas Murray
fonte
Eu quero aplicar um estilo a um determinado div. Por exemplo, no tempo de carregamento, tudo com uma classe de foo seria mostrado, mas eu posso querer desativar uma instância da classe foo que tem um id de bar.
Nicholas Murray
1
Então você simplesmente faria, $('#bar.foo').toggle();você sempre terá apenas um id, pois eles são EXIGIDOS para serem exclusivos para o documento. se você deseja alternar esse id apenas se for da classe foo, basta adicionar a classe ao seletor de id. se o seletor encontrar um conjunto vazio, nada acontecerá, se ele encontrar um conjunto com resultados (dos quais haverá apenas um), ele alternará o elemento. Eu acho que você está pensando demais nisso.
prodigitalson
3
apenas para dizer que é frustrante as pessoas dizerem "por que você faria isso?" quando estou tentando fazer isso agora. O problema com hasClass é que ele retorna True se QUALQUER elemento que corresponda ao seletor tiver a classe fornecida. Então, onde tenho muitos p com a classe "bolo" e nomes de classe adicionais para cada um ("um", "dois" etc.), estou tendo um problema. Quero selecionar o conjunto geral de p.cake e, em seguida, ter um condicional (if class = "one" - $ var = 23 - etc). A questão é que estou tentando passar um $ var diferente, dependendo do nome da classe adicional. Estou tentando não ter que repetir tudo o
Stella

Respostas:

171

Você pode assar essa lógica no seletor combinando vários seletores . Por exemplo, podemos direcionar todos os elementos com um determinado id, que também têm uma classe particular:

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

Isso deve ser semelhante a algo que você escreveria em CSS. Observe que não se aplica a todos os #fooelementos (embora deva haver apenas um) e não se aplica a todos os .barelementos (embora possa haver muitos). Ele fará referência apenas a elementos que se qualificam em ambos os atributos.

jQuery também tem um ótimo .ismétodo que permite determinar se um elemento possui certas qualidades. Você pode testar uma coleção jQuery em um seletor de string, um elemento HTML ou outro objeto jQuery. Nesse caso, vamos apenas verificar em um seletor de string:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'
Sampson
fonte
32
1 para is(). Deve haver um .hasId()seletor só porque parece um parceiro óbvio para .hasClass()realmente ...
Matt Fletcher
43

Eu provavelmente usaria $('.mydiv').is('#foo');Isso, se você souber a Id, por que não aplicaria apenas no seletor em primeiro lugar?

filho pródigo
fonte
17
Talvez o código esteja indo para uma função de retorno de chamada que precisa lidar com um determinado caso de maneira diferente. Portanto, a função é passada a um objeto jQuery automaticamente com atributos desconhecidos. Nesse caso, $ ('sua resposta'). Is ('útil');
Peter G
1
Posso pensar em uma série de razões. E se você quiser aplicar uma configuração específica para celular, como se um elemento tivesse id = "mobile". O porquê não é importante.
Colocável em
Bem, apenas 1 elemento deve ter um dado, idcaso contrário, deve ser algum outro atributo ... Suponho que se a localização estrutural do elemento em questão muda com base na página ou cliente / agente do usuário, ok, mas diferente disso .. .
prodigitalson
19

atualização: desculpe entendeu mal a pergunta, .has()resposta removida .

outra forma alternativa, criar .hasId()plugin

// 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>

ewwink
fonte
5
Desculpe, mas acho que você interpretou mal a pergunta: has () API relata isto: Reduza o conjunto de elementos correspondentes para aqueles que têm um descendente que corresponda ao seletor ou elemento DOM. O OP está perguntando como testar se o elemento com a classe 'myDiv' também tem o Id foo, enquanto has () irá procurar descendentes de 'myDiv' tendo o Id 'foo'.
Inclinação
7

Digamos que você esteja iterando por meio de alguns objetos DOM e queira encontrar e capturar um elemento com um certo ID

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

Você pode escrever algo como encontrar

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

Observe que, se você usar um seletor de classe, o método find retornará todos os elementos correspondentes.

ou você pode escrever uma função iterativa que fará um trabalho mais avançado

<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
});

O mesmo código pode ser facilmente modificado para o seletor de classe.

<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
});

Fico feliz que você tenha resolvido seu problema com index (), o que sempre funcionou para você. Espero que isso ajude outras pessoas com o mesmo problema. Felicidades :)

Nima Foladi
fonte
4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });
Pontudo
fonte
o each é desnecessário porque nunca haverá mais de um #theMysteryId.
prodigitalson
2
Bem, isso evita o trabalho de atribuí-lo a uma variável, verificar se o comprimento não está vazio e, em seguida, prosseguir com o código. Se o seletor não corresponder a nada, o jQuery simplesmente não chamará a função "each", então é bom e limpo. Agora, se tudo o que você quer fazer é chamar alguma API jQuery, então com certeza.
Pointy de
4

Só para dizer que acabei resolvendo isso usando index ().

NADA mais parecia funcionar.

Portanto, para elementos irmãos, essa é uma boa solução se você estiver primeiro selecionando por uma classe comum e depois quiser modificar algo diferente para cada classe específica.

EDIT: para quem não sabe (como eu) index () dá um valor de índice para cada elemento que combina com o seletor, contando de 0, dependendo de sua ordem no DOM. Contanto que você saiba quantos elementos existem com class = "foo", você não precisa de um id.

Obviamente, isso nem sempre ajuda, mas alguém pode achar útil.

Stella
fonte
3

Verifique se o ID do elemento existe

if ($('#id').attr('id') == 'id')
{
  //OK
}

Việt Anh
fonte
1

Você também pode verificar se o elemento id é usado ao fazer isso:

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

Eu uso este método para dataTables globais e dataTables ordenados específicos

user3379167
fonte
o indefinido deve estar entre aspas para funcionar assim 'indefinido'
Leão