Selecionar elementos por atributo


253

Eu tenho uma coleção de caixas de seleção com IDs gerados e alguns deles têm um atributo extra. É possível usar o JQuery para verificar se um elemento possui um atributo específico? Por exemplo, posso verificar se o seguinte elemento possui o atributo "myattr"? O valor do atributo pode variar.

<input type="checkbox" id="A" myattr="val_attr">A</input>

Por exemplo, como posso obter uma coleção de todas as caixas de seleção que possuem esse atributo sem marcar uma a uma? Isso é possível?


2
Como um aparte, uma <entrada /> é uma tag vazia que não deve ter conteúdo dentro dela. Talvez você não está preocupado com a validação vendo como você tem presente myatttr ...
Scotte


Se você já tem uma coleção e você quer filtrar os únicos elementos com atributo específico - basta fazê-lo -$filtered = $collection.filter('[attribute_name]');
jave.web

Respostas:


190

Você quer dizer que você pode selecioná-los? Se sim, então sim:

$(":checkbox[myattr]")

4
Observe que se você está testando a existência (presumivelmente em uma instrução if, por exemplo), provavelmente é mais correto / confiável: if ($ (": checkbox [myattr]"). Length ()> 0) ...
Rinogo 15/08/11

14
@rinogo: na verdade, tudo o que você precisa é if ($ (": checkbox [myattr]"). length). O comprimento () depois não é necessário, nem o> 0, 0 é avaliado como falso em testes de igualdade que não exigem igualdade estrita (valor e tipo).
precisa saber é o seguinte

1
Ele lança erros js se você tentar algo como: td [myattr]. Por isso, acho que esse recurso foi direcionado especificamente às caixas de seleção.
fooledbyprimes

6
Os dois pontos selecionam pseudo-classes, determinadas pelo tipo attr. Para aplicar a mesma coisa aos td's, basta omitir os dois pontos.
dhochee

Ou se você quiser ver se algo não tem um atributo, como encontrar todos os links que não têm hrefatributos. $("#myBox").find('a').filter(':not([href])')
timbrown

368
if ($('#A').attr('myattr')) {
    // attribute exists
} else {
    // attribute does not exist
}

EDITAR:

O elseitem acima cairá na ramificação quando myattrexistir, mas é uma sequência vazia ou "0". Se isso for um problema, você deve testar explicitamente undefined:

if ($('#A').attr('myattr') !== undefined) {
    // attribute exists
} else {
    // attribute does not exist
}

3
Não é uma ótima resposta. "undefined" não é uma palavra-chave em Javascript. Veja constc.blogspot.com/2008/07/…
mhenry1384

16
Você está certo ... Mas redefinir undefinedé considerado um caso extremo e a comparação acima funcionará em 99% de todos os casos.
Stefan Gehrig

6
Não funciona se o atributo tiver uma sequência vazia. Um exemplo é myattr = ''
mythicalprogrammer

3
@ Henry - então você estaria em erro :) Se você estivesse construindo o projeto para mim ou ao meu lado, eu exigiria que você corrija seu erro. Se fosse um pacote de código aberto, eu (junto com muitos usuários) pararia de usá-lo com base no fato de que ele estava mal codificado. Se você não a alterasse, alguém iria eventualmente bifurcar uma versão sem o erro e as pessoas a usariam, e você perderia seu próprio projeto, como aconteceu muitas vezes antes quando alguém cria um pacote que é uma boa ideia com má implementação. De qualquer maneira ele iria ensinar-lhe uma lição sobre práticas de codificação :)
Jimbo Jonny

8
if (.! typeof $ ( '# A') attr ( 'myattr') == 'indefinido')
James Westgate

166

Sei que já faz muito tempo desde que a pergunta foi feita, mas achei a verificação mais clara assim:

if ($("#A").is('[myattr]')) {
    // attribute exists
} else {
    // attribute does not exist
}

(Como encontrado neste site aqui )

Documentação sobre se pode ser encontrada aqui


De acordo com o W3C, os atributos booleanos são definidos pela presença ou ausência do atributo. O jQuery fornece o método .attr () para manipular valores de atributos. Mas como adicionamos um atributo sem valor? O método que você fornece para testar a presença de um atributo não está descrito na documentação do jQuery (1.8.2). Você sabe como adicionar um atributo com jQuery?
chmike

@chmike Para adicionar um atributo, eu faria da seguinte maneira: $ ("# A"). prop ("myNewAttribute", someValue); Você pode atribuir a algum valor qualquer valor de sua escolha: sequência, número, sequência vazia, verdadeiro / falso.
precisa

Isso adicionará o atributo com um valor atribuído que não é o mesmo que um atributo sem valor.
chmike

5
Concordo, esta é a melhor resposta (usando jQuery) - muito clara e concisa. Eu me perguntei por que o jQuery não tem apenas uma função hasAttribute () e a resposta é que o javascript nativo já tem uma. Qualquer elemento HTML Dom possui um método hasAttribute ('attributeName'). Então você pode fazer: $ ('# A') [0] .hasAttribute ('myattr') @chmike - Acho que você não pode adicionar um atributo vazio usando as funções jQuery, mas pode fazê-lo com o elemento HTML Dom objeto de maneira semelhante à seguinte: $ ("# A") [0] .setAttributeNode (document.createAttribute ("myNewAttribute"));
Daniel Howard

1
Apenas um comentário que eu gosto desta resposta, mas fiquei confuso sobre os comentários perguntando como adicionar um atributo sem valor. Eles não estão relacionados à pergunta ou à resposta.
goodeye

9

Isso funcionará:

$('#A')[0].hasAttribute('myattr');


@RetroCoder, qual é o seu ponto sobre o seu link? Este teste parece bastante bom, especialmente porque muitas vezes você usar $(this).<something>quando aqui você pode fazer this.hasAttribute('...')directamente (e não se preocupam com os navegadores mais antigos, é claro.)
Alexis Wilke

8

Em JavaScript, ...

null == undefined

... retorna true*. É a diferença entre ==e ===. Além disso, o nome undefinedpode ser definido (não é uma palavra-chave como nullé), portanto é melhor verificar de outra maneira. A maneira mais confiável é provavelmente comparar o valor de retorno do typeofoperador.

typeof o == "undefined"

No entanto, comparar com null deve funcionar nesse caso.

* Supondo que undefinedé de fato indefinido.


Indefinido não é uma palavra-chave reservada em JavaScript. No jQuery, é possível alterar o nome exatamente porque ele é construído com o contrator "var" e não é valorizado. No topo do código da biblioteca mágica, de fato, há uma linha que afirma "var indefinido"; e dessa maneira uma variável indefinida é definida com esse nome no escopo do jQuery ... Mas tudo pode ser nomeado "sem nome", digitando "var unnamed;"
Emanuele Del Grande

1
Isso não verifica um atributo, essa verificação de uma propriedade em um objeto javascript por que isso tem 6 votos positivos?
Ncubica 23/07/2013

5

$("input[attr]").length pode ser uma opção melhor.


4

Algumas idéias foram lançadas usando "typeof", jQuery ".is" e ".filter", então pensei em publicar uma rápida comparação de perf. O typeof parece ser a melhor opção para isso. Enquanto os outros funcionarão, parece haver uma clara diferença de desempenho ao chamar a biblioteca jq para esse esforço.


2
if (!$("#element").attr('my_attr')){
  //return false
  //attribute doesn't exists
}

1
isso provavelmente não funcionará, pois você pode adicionar um atributo sem valor. nesse caso, essa condição será aprovada, embora o comportamento desejado possa ser retornar true, o atributo está definido. semelhante ao do PHP isset()ou por exemplo em js $("#element").attr('my_attr') === false,
ulkas

2

Como nesta postagem , usando .iso seletor de atributos [], você pode adicionar facilmente uma função (ou protótipo):

function hasAttr($sel,attr) {
    return $sel.is('['+attr+']');
}


1

simplesmente:

$('input[name*="value"]')

mais informações: documentos oficiais


1
Aspas duplas sem escape dentro da sequência definida com aspas duplas, não uma sequência válida. Infelizmente, não posso editá-lo para você porque uma edição precisa alterar 6 caracteres ou mais, mas precisa ser alterada.
perfil completo de Jimbo Jonny

0

Além de selecionar todos os elementos com um atributo $('[someAttribute]')ou $('input[someAttribute]')você também pode usar uma função para fazer verificações booleanas em um objeto, como em um manipulador de cliques:

if(! this.hasAttribute('myattr') ) { ...


0

Eu criei o pacote npm com o comportamento pretendido, conforme descrito acima em questão.

Link para [npm] e [github]

O uso é muito simples. Por exemplo:

<p id="test" class="test">something</p>
$("#test").hasAttr("class")

retorna verdadeiro.

Também funciona com camelcase.


0

Para selecionar elementos com um determinado atributo, consulte as respostas acima.

Para determinar se um determinado elemento jQuery tem um atributo específico, estou usando um pequeno plug-in que retorna truese o primeiro elemento da coleção ajQuery tiver este atributo:

/** hasAttr
 ** helper plugin returning boolean if the first element of the collection has a certain attribute
 **/
$.fn.hasAttr = function(attr) {
   return 0 < this.length
       && 'undefined' !== typeof attr
       && undefined !== attr
       && this[0].hasAttribute(attr)
}

-5

JQuery retornará o atributo como uma sequência. Portanto, você pode verificar o comprimento dessa sequência para determinar se está definido:

if ($("input#A").attr("myattr").length == 0)
 return null;
else
 return $("input#A").attr("myattr");

Então, eu sei que já faz mais de um ano e eu deveria ter abordado isso há muito tempo. Estou curioso sobre qual parte não funcionou? Se eu soubesse que você estava apenas tentando selecioná-los, não teria fornecido o código acima. Eu pensei que você queria vê-los individualmente. De fato, o JQuery retorna o atributo como uma string e você pode verificar o comprimento dessa string como qualquer outra string. Portanto, desde que o seletor e o atributo estejam corretos, você poderá testar se uma entrada específica possui esse atributo. Enfim, eu simplesmente não queria que as pessoas desconsiderassem o princípio, porque funciona.
Zach

6
falhará no caso em que o atributo não estiver presente; nesse caso, $ ("input # A"). attr ("myattr") retornará indefinido em vez de uma string e undefined.length falhará
Rune FS

Detecta apenas um atributo vazio versus um com conteúdo, falha em um atributo inexistente. A pergunta original era sobre detectar a existência do atributo, tornando isso uma falha como resposta à pergunta.
perfil completo de Jimbo Jonny
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.