2009-01-04 56 views
19

我期望擴展jQuery,以便輕鬆檢索jQuery對象中第一個元素的tagName。這是我想到的,但它似乎並沒有工作:如何擴展jQuery,使其更容易檢索標記名

$.fn.tagName = function() { 
    return this.each(function() { 
     return this.tagName; 
    }); 
} 
alert($('#testElement').tagName()); 

任何想法有什麼不對?

順便說一句,我期待使用這更多的測試比生產。

+0

爲什麼不只是使用.attr('tagName') – redsquare 2009-01-04 22:46:09

+2

redsquare,tagName不是屬性! – James 2009-01-05 11:05:36

回答

36

試試這個:

$.fn.tagName = function() { 
    return this.get(0).tagName; 
} 
alert($('#testElement').tagName()); 

爲了解釋多一點點,爲什麼你原來的例子沒有工作,each()方法將總是返回原來的jQuery對象(除非jQuery對象本身進行了修改) 。要看到什麼是每個與您的代碼發生的事情,這裏是一些僞代碼,顯示each()方法的工作原理:

這不是each()如何真正得到實現的(由一個長鏡頭可能),但它是顯示您的action()函數的返回值將被忽略。

+5

將標籤轉換爲小寫可能是個好主意。 return this.get(0).tagName.toLowerCase() – 2009-01-04 23:40:42

11

爲什麼要創建一個插件?似乎有點不必要...

alert($('div')[0].tagName); 
11

您可能希望添加toLowerCase()以使其更加一致(和XHTML兼容)。

$.fn.tagName = function() { 
    return this.get(0).tagName.toLowerCase(); 
} 

alert($('#testElement').tagName()); 
3

這將返回匹配元素的小寫標記名。

例如,

jQuery("#test_div").tagName(); 

將返回div(假設元件是一個div)。

如果傳遞一個元素集合,它將返回一個包含所有標記名稱的數組,其中每個數組條目都與匹配的元素相對應。

例如,如果我們在下面的(X)HTML運行

jQuery(".classname").tagName(); 

<div> 
<p class="classname">test text</p> 
<div class="anotherClass"> 
    <ul> 
     <li class="classname"><a href="test">Test link</a></li> 
    </ul> 
    <p class="classname">Some more text</p> 
</div> 
<div> 

將標記名的數組:

["p", "li", "p"] 

這是函數 - 這是基本上與上面相同,但它支持多個元素,這可能會或可能不會對您的項目有用。

jQuery.fn.tagName = function(){ 
    if(1 === this.length){ 
     return this[0].tagName.toLowerCase(); 
    } else{ 
     var tagNames = []; 
     this.each(function(i, el){ 
      tagNames[i] = el.tagName.toLowerCase(); 
     }); 
     return tagNames; 
    } 
}; 
相關問題