2009-10-07 10 views
114

Mam kilka elementów na stronie HTML, które mają tę samą klasę - ale są to różne typy elementów. Chcę dowiedzieć się nazwy znacznika elementu, gdy nad nim zapętlałem - ale .attr nie przyjmuje "znacznika" ani "zmiennej".Czy jQuery może zawierać nazwę znacznika?

Oto co mam na myśli. Rozważ te elementy na stronie:

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

teraz chcę uruchomić coś podobnego do tego, aby zapewnić, że moje wszystkie elementy posiadają identyfikator, jeśli nie został już zdefiniowany:

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

Wynik bym to tak, jakby elementy H2 i H4 miałyby wówczas odpowiednio ID równy

rndh2_1 
rndh4_3 
rndh2_1 
rndh4_3 

Jakieś pomysły, w jaki sposób mogę odkryć nazwę znacznika elementu reprezentowanego przez "to"?

+1

Może odpowiedź jest tutaj: http://stackoverflow.com/a/8355251/271103 –

Odpowiedz

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

powinny być

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

Musisz użyć this.nodeName.toLowerCase(), ponieważ większość DOM reprezentacje dokumentów HTML automatycznie dodają wielkie litery do nodeName. – NickFitz

+0

zarówno this.nodeName, jak i this.tagName wydają się działać dla mnie. Dziękuje wszystkim! – BigPigVT

+5

+1 za podanie nazwy węzła. Czasami jQuery jest o jeden krok za daleko :-) –

165

można spróbować to:

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

Zobacz docs dłużej na to().

+11

Do kogo może to dotyczyć: jeśli zająć się moją odpowiedzią, proszę powiedz mi, dlaczego mogę ją poprawić i uczyć się na przyszłe odpowiedzi na SO. Dzięki. – middus

+3

Nienawidzę tego też. W każdym razie przegłosowałem, ponieważ 'nodeName' zwraca ciąg znaków, który w zależności od przeglądarki jest pisany dużymi literami lub nie. –

+2

Załóżmy, że: nie masz tylko niewielkiego wyboru możliwych tagów, ale może to być jeden ze 100 znaczników html. Następnie musisz napisać: $ (this) .is ("sometag") 100+ razy. Zakładam, że dlatego niektórzy odrzucili twoją odpowiedź. – ximi

3

Tak. Można użyć poniższy kod:

this.tagName 
53

Odkąd hit to pytanie raz przed i to mi nie pomaga w moim przypadku (nie mają this, lecz miał wystąpienie selektor jQuery) . Wywołanie get() dostaniesz element HTML, dzięki któremu uzyskasz nodeName, jak wspomniano powyżej.

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

lub

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

Jesteś mężczyzną! –

+1

pierwsza pomocna na stronie – Rooster

+0

Dokładnie to, czego szukałem, bardzo pomocne - dzięki :-) – TonyR

46

Można również użyć $(this).prop('tagName'); jeśli używasz jQuery 1.6 lub wyższej.

+0

To jest dokładnie to, czego potrzebowałem. W moim projekcie miałem pod ręką element jquery, ale nie oryginalny element HTML DOM. To działa dla mnie. – Gilthans

+0

Myślę, że to jest dokładna odpowiedź, która odpowiada na temat tego pytania. – CodeTweetie

1

Myślę, że nie można użyć nodeName w jQuery, ponieważ nodeName jest właściwością DOM, a sama jQuery nie ma ani funkcji ani właściwości nodeName. Ale na podstawie respondenta, który jako pierwszy wspomniano o tym nodeName rzeczy, to jak udało mi się rozwiązać ten problem:

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

UWAGA: this tutaj jest obiekt jQuery.

0

Ponieważ jest to pytanie, które przychodzą na google za pomocą jquery zmiennej pierwszego dziecka jako zapytanie wyślę Inny przykład:

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

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

Rezultatem jest jQuery (wielkimi literami) zmienna: P

0

Rozważmy szybki FILTR metody:

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

powraca:

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

tak:

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

można uzyskać HTML element name tag na całej stronie.

Można użyć:

 $('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; 

uwaga: zastąpić to z selektora (H1, H3 lub ...)

0

ja dopiero napisałem go dla innego problemu i uważało, że może pomóc także tobie.

wykorzystania:

  • tj onclick="_DOM_Trackr(this);"

Parametry:

  1. DOM-Object do śledzenia
  2. RETURN/wyłącznik alarmu (opcjonalnie, domyślnie = alert)

kod źródłowy:

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

Przykładowy wynik: 'html> body> div # coreApp> div # productpage> div # product-wrapper> div> div> div> div> div # pthumb12> form # thumb_uploader_src> input' –

+0

** Inny przykład użycia: ** '$ ('*'). each (function (_i, _e) {$ (_ e) .attr ('title', _ DOM_Trackr (_e, true));});' –

0

Najlepszym sposobem, aby naprawić problem, jest zastąpienie $(this).attr("tag") albo this.nodeName.toLowerCase() lub this.tagName.toLowerCase().

Obie dają dokładnie taki sam wynik!

0

Zamiast tego po prostu zrobić:

$(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()); 
    }); 
}); 
Powiązane problemy