JQuery può fornire il nome del tag?


115

Ho diversi elementi su una pagina HTML che hanno la stessa classe, ma sono tipi di elementi diversi. Voglio scoprire il nome del tag dell'elemento mentre lo sovrappongo, ma .attr non accetta "tag" o "tagname".

Ecco cosa intendo. Considera questi elementi in 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 per assicurarmi che i miei elementi abbiano tutti un ID se uno non è già 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 che vorrei 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"?


Risposte:


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

dovrebbe essere

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

18
Dovrai usare this.nodeName.toLowerCase (), poiché la maggior parte delle rappresentazioni DOM dei documenti HTML inseriscono automaticamente in maiuscolo il nodeName.
NickFitz

sia this.nodeName che this.tagName sembrano funzionare per me. Ringrazia tutti!
BigPigVT

5
+1 per menzionare nodeName. A volte, jQuery è un passo troppo lontano :-)
Serge Wautier

2
+1 jQuery is () non fa il lavoro perché nel caso di h1, h2, ecc ci sono 6 casi diversi che devi gestire se usi is ().
Konstantin Dinev

166

Potresti provare questo:

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

Vedere la documentazione per ulteriori informazioni su is ().


12
A chi può interessare: se dai un voto negativo alla mia risposta, dimmi perché così posso migliorarla e imparare per future risposte SO. Grazie.
metà del

3
Lo odio anche io. Comunque ho upvoted perché nodeNamerestituisce una stringa che, a seconda del browser, è in maiuscolo o meno.
Marcel Falliere

2
Supponi quanto segue: non hai solo una piccola selezione di possibili tag, ma potrebbe essere uno qualsiasi di oltre 100 tag html. Quindi dovresti scrivere: $ (questo) .is ('qualcosa') più di 100 volte. Presumo che questo sia il motivo per cui alcune persone hanno svalutato la tua risposta.
ximi

Wow ... mai visto da is('*')anni. Probabilmente non risponderà all'OP ma ha funzionato per me, grazie, @middus!
Alastair

53

Dal momento che ho risposto a questa domanda una volta e non mi ha aiutato nel mio caso (non avevo thisun'istanza del selettore jQuery, ma invece avevo un'istanza di selettore jQuery). La chiamata get()ti darà l'elemento HTML, dal quale puoi ottenere il nodeNamecome 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
primo utile sulla pagina
Gallo

47

Puoi anche usarlo $(this).prop('tagName');se stai usando jQuery 1.6 o versioni successive.


Questo è esattamente ciò di cui avevo bisogno. Nel mio progetto avevo a portata di mano l'elemento jquery, ma non l'elemento HTML DOM originale. Questo funziona per me.
Gilthans

Penso che questa sia la risposta esatta che risponde all'argomento di questa domanda.
CodeTweetie


1

Penso che non puoi usare nodeNamein jQuery poiché nodeName è una proprietà DOM e jQuery stesso non ha una nodeNamefunzione o una proprietà. Ma sulla base dell'intervistato che per primo ha menzionato queste nodeNamecose, è così che sono riuscito a risolvere il problema:

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

NOTA: thisecco un oggetto jQuery.


0

Poiché questa è una domanda che vieni su Google usando jquery tagname first child come query, 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 jquery è un nome tag (maiuscolo): P


0

Puoi ottenere il nome del tag dell'elemento html su tutta la pagina.

Potresti usare:

        $('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: sostituiscilo con il tuo selettore (h1, h3 o ...)


0

L'ho appena scritto per un altro numero e ho pensato che potesse aiutare anche voi.

Uso:

  • vale a dire onclick="_DOM_Trackr(this);"

parametri:

  1. Oggetto DOM da tracciare
  2. interruttore di ritorno / avviso (opzionale, predefinito = avviso)

Codice sorgente:

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

Output di esempio:html > body > div#coreApp > div#productpage > div#productpage-wrapper > div > div > div > div > div#pthumb12 > form#thumb_uploader_src > input
Chris S.

Un altro esempio di utilizzo: $('*').each(function(_i,_e){$(_e).attr('title',_DOM_Trackr(_e,true));});
Chris S.

0

Il modo migliore per risolvere il tuo problema è sostituire $(this).attr("tag")con this.nodeName.toLowerCase()othis.tagName.toLowerCase() .

Entrambi producono lo stesso identico risultato!


0

Considera il metodo FILTER veloce :

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

ritorna:

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

così:

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

0

Invece fai 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()); 
  });
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.