2009-10-07 13 views
114

Ho diversi elementi in una pagina HTML che hanno la stessa classe, ma sono diversi tipi di elementi. Voglio scoprire il nome del tag dell'elemento mentre faccio il loop su di essi - ma .attr non accetta "tag" o "tagname".jQuery può fornire il nome del tag?

Ecco cosa intendo. Prendere in considerazione questi elementi di una pagina:

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

Ora voglio eseguire qualcosa di simile al fine di garantire che i miei elementi hanno tutti un ID se non è già stato definito:

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

Il risultato lo farei come sarebbe che gli elementi H2 e H4 avrebbero quindi un id di

rndh2_1 
rndh4_3 

rispettivamente.

Qualche idea su come posso scoprire il nome del tag dell'elemento rappresentato da "questo"?

+1

Forse risposta è qui: http://stackoverflow.com/a/8355251/271103 –

risposta

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

dovrebbe essere

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

Avrete bisogno di usare this.nodeName.toLowerCase(), come la maggior parte DOM le rappresentazioni di documenti HTML aumentano automaticamente il nodoNome. – NickFitz

+0

entrambi this.nodeName e this.tagName sembrano funzionare per me. Ringrazia tutti! – BigPigVT

+5

+1 per menzionare nodeName. A volte, jQuery è troppo avanti :-) –

165

si potrebbe provare questo:

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

Vedere la docs per più su è().

+11

A chi può interessare: se si sottovaluta la mia risposta, mi dica perché, così posso migliorarla e imparare per future risposte SO. Grazie. – middus

+3

Anch'io lo odio. Ad ogni modo ho fatto un upvoted perché 'nodeName' restituisce una stringa che, a seconda del browser, è superiore o meno. –

+2

Presumi quanto segue: non hai solo una piccola selezione di possibili tag, ma potrebbe essere uno qualsiasi dei 100 tag html. Quindi dovresti scrivere: $ (this) .is ('sometag') più di 100 volte. Presumo che questo è il motivo per cui alcune persone hanno ridimensionato la tua risposta. – ximi

3

Sì. È possibile utilizzare il codice qui sotto:

this.tagName 
53

Dal momento che ho colpito questa domanda una volta prima e non mi ha aiutato nel mio caso (non ho avuto un this, ma invece ha avuto un esempio di selezione jQuery) . Chiamando get() otterrai l'elemento HTML, con il quale è possibile ottenere lo nodeName come menzionato sopra.

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

o

$('.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 
+1

Sei l'uomo! –

+1

primo utile uno sulla pagina – Rooster

+0

Esattamente quello che stavo cercando, molto utile - grazie :-) – TonyR

46

Si potrebbe anche usare $(this).prop('tagName'); se si sta utilizzando jQuery 1.6 o superiore.

+0

Questo è esattamente ciò di cui avevo bisogno. Nella mia progettazione, avevo a portata di mano l'elemento jquery, ma non l'elemento HTML DOM originale. Questo funziona per me. – Gilthans

+0

Penso che questa sia la risposta esatta che risponde al tema di questa domanda. – CodeTweetie

1

Penso che non sia possibile utilizzare lo nodeName in jQuery poiché nodeName è una proprietà DOM e jQuery non ha una funzione o proprietà nodeName. Ma in base al convenuto che la prima volta su questa roba nodeName, questo è come sono stato in grado di risolvere il problema:

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

NOTA: this qui è un oggetto jQuery.

0

Dal momento che questa è una domanda si arriva lungo su Google utilizzando jQuery nometag primo figlio come una query vi posterò un altro esempio:

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

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

Il risultato è un jquery (maiuscolo) TagName: P

0

consideri il veloce metodo di FILTRO:

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

restituisce:

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

così:

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

È possibile ottenere html nome di un elemento tag su pagina intera.

Si potrebbe utilizzare:

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

nota: sostituire questo con il vostro selettore (H1, H3 o ...)

0

ho appena scritto per un altro problema e ho pensato che potrebbe aiutare entrambi.

utilizzo:

  • cioè onclick="_DOM_Trackr(this);"

Parametri:

  1. DOM-Object per rintracciare
  2. ritorno/interruttore di allarme (opzionale, default = avviso)

Fonte-Code:

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

Esempio di output: 'html> corpo> div # coreApp> div # pagina prodotto> div # productpage-wrapper> div> div> div> div> div # pthumb12> modulo # thumb_uploader_src> input' –

+0

** Un altro esempio di utilizzo: ** . '$ ('*') ciascuna (function (_I, _E) {$ (_ e) .attr ('titolo', _ DOM_Trackr (_E, true));});' –

0

Il modo migliore per risolvere il problema, è quello di sostituire $(this).attr("tag") sia con this.nodeName.toLowerCase() o this.tagName.toLowerCase().

Entrambi producono esattamente lo stesso risultato!

0

Invece semplicemente:

$(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()); 
    }); 
}); 
Problemi correlati