JQuery có thể cung cấp tên thẻ không?


115

Tôi đã có một số thành phần trên trang HTML có cùng một lớp - nhưng chúng là các loại phần tử khác nhau. Tôi muốn tìm ra tên thẻ của thành phần khi tôi lặp qua chúng - nhưng .attr không lấy "tag" hoặc "tagname".

Ý tôi là đây. Hãy xem xét các yếu tố này trên một trang:

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

Bây giờ tôi muốn chạy một cái gì đó như thế này để đảm bảo rằng tất cả các phần tử của tôi đều có id nếu chưa được xác định:

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

Kết quả tôi muốn là các nguyên tố H2 và H4 sau đó sẽ có id

rndh2_1
rndh4_3

tương ứng.

Có ý tưởng nào về cách tôi có thể khám phá tên thẻ của thành phần được biểu thị bằng "this" không?


1
Có lẽ câu trả lời là đây: stackoverflow.com/a/8355251/271103
Hakan KOSE

Câu trả lời:


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

nên là

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

18
Bạn sẽ cần sử dụng this.nodeName.toLowerCase (), vì hầu hết các biểu diễn DOM của tài liệu HTML sẽ tự động viết hoa tên nút.
NickFitz

cả this.nodeName và this.tagName dường như hoạt động với tôi. Cảm ơn tất cả!
BigPigVT

5
+1 để đề cập đến nodeName. Đôi khi, jQuery là một bước quá xa :-)
Serge Wautier

2
+1 jQuery là () không thực hiện công việc vì trong trường hợp h1, h2, v.v., có 6 trường hợp khác nhau mà bạn phải xử lý nếu sử dụng is ().
Konstantin Dinev

166

Bạn có thể thử điều này:

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

Xem các tài liệu để biết thêm về là ().


12
Đối với ai nó có thể quan tâm: nếu bạn đánh giá thấp câu trả lời của tôi, xin vui lòng cho tôi biết lý do tại sao tôi có thể cải thiện nó và tìm hiểu các câu trả lời SO trong tương lai. Cảm ơn.
middus

3
Tôi cũng ghét nó. Dù sao, tôi đã nâng cấp vì nodeNametrả về một chuỗi, tùy thuộc vào trình duyệt, có phải là lớp trên hay không.
Marcel Falliere

2
Giả sử như sau: Bạn không chỉ có một lựa chọn nhỏ các thẻ có thể, nhưng nó có thể là bất kỳ trong số hơn 100 thẻ html. Sau đó, bạn cần phải viết: $ (this) .is ('thỉnh thoảng') hơn 100 lần. Tôi cho rằng đây là lý do tại sao một số người đánh giá thấp câu trả lời của bạn.
ximi

Wow ... chưa từng thấy is('*')trong nhiều năm. Nó có thể sẽ không trả lời OP nhưng nó đã làm việc cho tôi, cảm ơn, @middus!
Alastair

53

Vì tôi đã gặp câu hỏi này một lần trước đây và nó không giúp tôi trong trường hợp của tôi (tôi không có this, nhưng thay vào đó có một ví dụ về bộ chọn jQuery). Gọi get()sẽ giúp bạn có được phần tử HTML, qua đó bạn có thể nhận được nodeNamenhư đã đề cập ở trên.

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

hoặc là

$('.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
người hữu ích đầu tiên trên trang
Dậu

47

Bạn cũng có thể sử dụng $(this).prop('tagName');nếu bạn đang sử dụng jQuery 1.6 trở lên.


Đây chính xác là những gì tôi cần. Trong thiết kế của tôi, tôi có phần tử jquery tiện dụng, nhưng không phải là phần tử DOM DOM gốc. Điều này làm việc cho tôi.
Gilthans

Tôi nghĩ rằng đây là câu trả lời chính xác trả lời chủ đề của câu hỏi này.
CodeTweetie


1

Tôi nghĩ rằng bạn không thể sử dụng nodeNametrong jQuery vì nodeName là một thuộc tính DOM và bản thân jQuery không có nodeNamechức năng hoặc thuộc tính. Nhưng dựa trên người trả lời lần đầu tiên đề cập đến nodeNamecông cụ này, đây là cách tôi có thể giải quyết vấn đề:

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

LƯU Ý: thisđây là một đối tượng jQuery.


0

Vì đây là câu hỏi bạn xuất hiện trên google bằng cách sử dụng thẻ tên jquery con đầu tiên làm truy vấn nên tôi sẽ đăng một ví dụ khác:

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

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

Kết quả jquery là một tagname (chữ hoa): P


0

Bạn có thể lấy tên thẻ phần tử html trên toàn bộ trang.

Bạn đã có thể sử dụng:

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

lưu ý: thay thế cái này bằng bộ chọn của bạn (h1, h3 hoặc ...)


0

Tôi chỉ viết nó cho một vấn đề khác và nghĩ rằng nó cũng có thể giúp một trong hai bạn.

Sử dụng:

  • I E onclick="_DOM_Trackr(this);"

Thông số:

  1. Đối tượng DOM để theo dõi
  2. công tắc trở lại / cảnh báo (tùy chọn, mặc định = cảnh báo)

Mã nguồn:

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

Kết quả ví dụ:html > body > div#coreApp > div#productpage > div#productpage-wrapper > div > div > div > div > div#pthumb12 > form#thumb_uploader_src > input
Chris S.

Một ví dụ sử dụng khác: $('*').each(function(_i,_e){$(_e).attr('title',_DOM_Trackr(_e,true));});
Chris S.

0

Cách tốt nhất để khắc phục vấn đề của bạn, là để thay thế $(this).attr("tag")với một trong hai this.nodeName.toLowerCase()hoặc this.tagName.toLowerCase().

Cả hai đều tạo ra kết quả chính xác như nhau!


0

Hãy xem xét phương pháp LỌC nhanh :

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

trả về:

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

vì thế:

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

0

Thay vào đó chỉ đơn giản là làm:

$(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()); 
  });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.