2009-01-04 44 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; 
    } 
};