O jQuery pode fornecer o nome da tag?

115

Eu tenho vários elementos em uma página HTML que têm a mesma classe - mas eles são tipos de elementos diferentes. Quero descobrir o nome da marca do elemento conforme faço um loop sobre eles - mas .attr não aceita "tag" ou "tagname".

Aqui está o que quero dizer. Considere estes elementos em uma página:

<h1 class="rnd">First</h1>
<h2 id="foo" class="rnd">Second</h2>
<h3 class="rnd">Third</h3>
<h4 id="bar" class="rnd">Fourth</h4>

Agora quero executar algo assim para garantir que todos os meus elementos tenham um id, caso ainda não tenha sido definido:

$(function() {
  $(".rnd").each(function(i) {
    var id = $(this).attr("id");
    if (id === undefined || id.length === 0) {
      // this is the line that's giving me problems.
      // .attr("tag") returns undefined
      $(this).attr("id", "rnd" + $(this).attr("tag") + "_" + i.toString());
    }
  });
});

O resultado que eu gostaria seria que os elementos H2 e H4 teriam um id de

rndh2_1
rndh4_3

respectivamente.

Alguma idéia de como posso descobrir o nome da tag do elemento representado por "this"?

BigPigVT
fonte
1
Talvez a resposta esteja aqui: stackoverflow.com/a/8355251/271103
Hakan KOSE

Respostas:

110
$(this).attr("id", "rnd" + $(this).attr("tag") + "_" + i.toString());

deveria estar

$(this).attr("id", "rnd" + this.nodeName.toLowerCase() + "_" + i.toString());
Wabbitseason
fonte
18
Você precisará usar this.nodeName.toLowerCase (), já que a maioria das representações DOM de documentos HTML colocam automaticamente o nodeName em maiúsculas.
NickFitz,
tanto this.nodeName quanto this.tagName parecem funcionar para mim. Obrigado a todos!
BigPigVT,
5
1 para mencionar nodeName. Às vezes, jQuery é um passo longe demais :-)
Serge Wautier
2
+1 jQuery is () não faz o trabalho porque no caso de h1, h2, etc, existem 6 casos diferentes que você deve tratar se usar is ().
Konstantin Dinev
166

Você pode tentar isto:

if($(this).is('h1')){
  doStuff();
}

Veja o documentação para mais informações sobre is ().

meio
fonte
12
A quem possa interessar: se você votar contra minha resposta, diga-me por que para que eu possa melhorá-la e aprender para futuras respostas SO. Obrigado.
middus de
3
Eu também odeio. De qualquer forma, eu votei a favor porque nodeNameretorna uma string que, dependendo do navegador, é maiúscula ou não.
Marcel Falliere de
2
Suponha o seguinte: Você não tem apenas uma pequena seleção de tags possíveis, mas pode ser qualquer uma das mais de 100 tags html. Então você precisa escrever: $ (this) .is ('something') a mais de 100 vezes. Presumo que seja por isso que algumas pessoas votaram contra sua resposta.
ximi
Uau ... nunca vi is('*')em anos. Provavelmente não vai responder ao OP, mas funcionou para mim, obrigado, @middus!
Alastair
53

Já que já respondi a essa pergunta uma vez e isso não me ajudou no meu caso (eu não tinha um this, mas em vez disso tinha uma instância do seletor jQuery). Chamar get()irá obter o elemento HTML, pelo qual você pode obter o nodeNameconforme mencionado acima.

this.nodeName; // In a event handler, 'this' is usually the element the event is called on

ou

$('.hello:first-child').get(0).nodeName; // Use 'get' or simply access the jQuery Object like an array
$('.hello:first-child')[0].nodeName;     // will get you the original DOM element object
Scott Kirkwood
fonte
1
o primeiro útil na página
Galo
47

Você também pode usar $(this).prop('tagName');se estiver usando jQuery 1.6 ou superior.

Bijay Rungta
fonte
Isso é exatamente o que eu precisava. Em meu projeto, eu tinha o elemento jquery à mão, mas não o elemento HTML DOM original. Isso funciona para mim.
Gilthans
Eu acho que esta é a resposta exata que responde ao assunto desta questão.
CodeTweetie
3

Sim. Você pode usar o código abaixo:

this.tagName
fernando
fonte
1

Acho que você não pode usar o nodeNameem jQuery, pois nodeName é uma propriedade DOM e o próprio jQuery não tem uma nodeNamefunção ou propriedade. Mas, com base no entrevistado que mencionou pela primeira vez sobre essas nodeNamecoisas, foi assim que consegui resolver o problema:

this.attr("id", "rnd" + this.attr("nodeName") + "_" + i.toString());

NOTA: thisaqui está um objeto jQuery.

Instigar
fonte
0

Já que esta é uma pergunta que você vem no google usando jquery tagname first child como uma consulta, postarei outro exemplo:

<div><p>Some text, whatever</p></div>

$('div').children(':first-child').get(0).tagName); // ...and not $('div:first-child')[...]

O resultado do jquery é um tagname (maiúsculo): P

Hein
fonte
0

Você pode obter o nome da tag do elemento html em toda a página.

Você pode usar:

        $('body').contents().on("click",function () {
          var string = this.tagName;
          alert(string);
         });
user2029521
fonte
0
you can try:
jQuery(this).get(0).tagName;
or
jQuery(this).get(0).nodeName;

observação: substitua pelo seu seletor (h1, h3 ou ...)

Akbar amani
fonte
0

Acabei de escrever para outra edição e achei que pode ajudar qualquer um de vocês também.

Uso:

  • ie onclick="_DOM_Trackr(this);"

Parâmetros:

  1. Objeto DOM para rastrear
  2. interruptor de retorno / alerta (opcional, padrão = alerta)

Código fonte:

function _DOM_Trackr(_elem,retn=false)
{
    var pathTrackr='';
    var $self=$(_elem).get(0);
    while($self && $self.tagName)
    {
        var $id=($($self).attr("id"))?('#'+$($self).attr("id")):'';
        var $nName=$self.tagName;
        pathTrackr=($nName.toLowerCase())+$id+((pathTrackr=='')?'':' > '+(pathTrackr));
        $self=$($self).parent().get(0);
    }
    if (retn)
    {
        return pathTrackr;
    }
    else
    {
        alert(pathTrackr);
    }
}
Chris S.
fonte
Exemplo de saída:html > body > div#coreApp > div#productpage > div#productpage-wrapper > div > div > div > div > div#pthumb12 > form#thumb_uploader_src > input
Chris S.
Outro exemplo de uso: $('*').each(function(_i,_e){$(_e).attr('title',_DOM_Trackr(_e,true));});
Chris S.
0

A melhor maneira de resolver seu problema é substituí-lo $(this).attr("tag")por this.nodeName.toLowerCase()ou this.tagName.toLowerCase().

Ambos produzem exatamente o mesmo resultado!

John Slegers
fonte
0

Considere o método FILTER rápido :

$('.rnd').filter('h2,h4')

retorna:

[<h2 id=​"foo" class=​"rnd">​Second​</h2>​, <h4 id=​"bar" class=​"rnd">​Fourth​</h4>​]

tão:

$('.rnd').filter('h2,h4').each(function() { /*...$(this)...*/ });
Francesco Casula
fonte
0

Em vez disso, basta fazer:

$(function() {
  $(".rnd").each(function(i) {
    var id = $(this).attr("id");
    if (id === undefined || id.length === 0) {
      // this is the line that's giving me problems.
      // .attr("tag") returns undefined
      // change the below line...
      $(this).attr("id", "rnd" + this.tagName.toLowerCase() + "_" + i.toString()); 
  });
});
Alireza
fonte