我如何确定jQuery中匹配元素的元素types?

我通过ID名称匹配ASP.Net生成的元素,但我有一些元素可能呈现为文本框或标签取决于页面上下文。 我需要确定是否匹配到文本框或标签,以便知道是否通过val()或html()获取内容。

$("[id$=" + endOfIdToMatch + "]").each(function () { //determine whether $(this) is a textbox or label //do stuff }); 

我发现一个不起作用的解决scheme,它只是返回“未定义”:

 $("[id$=" + endOfIdToMatch + "]").each(function () { alert($(this).tagName); }); 

我错过了什么?

只是一个jQuery太多:

 $("[id$=" + endOfIdToMatch + "]").each(function () { alert(this.tagName); }); 

考虑这个解决scheme,不使用each()

 var elements = $("[id$=" + endOfIdToMatch + "]"); var vals = elements.is("input").val(); var htmls = elements.is("label").html(); var contents = vals.concat(htmls); 

看看是的文档。

你也可以使用这样的东西:

 if ($(this).is('input:checkbox')) 

用你需要的任何实例replace“this”,用你需要的任何inputtypesreplace“checkbox”。

我第一次回答我自己的问题。 多一点实验之后:

 $("[id$=" + endOfIdToMatch + "]").each(function () { alert($(this).attr(tagName)); }); 

作品!

tagName是一个不错的提示。 我想build议也使用tagName.toLowerCase(),因为返回的值取决于文档types(HTML或XML / XHTML)。

请参阅: http : //reference.sitepoint.com/javascript/Element/tagName

在jquery 1.6中使用prop()

 var el = $('body'); if (el.prop('tagName') === 'BODY') { console.log('found body') } 

这是获取元素types的最佳方式

 function tgetelementType( elmentid ) { var TypeName = $('#' + elmentid).get(0).tagName; var TypeName2 = $('#' + elmentid).get(0).type; if($('#' + elmentid).get(0).tagName== "INPUT") { return $('#' + elmentid).get(0).type.toUpperCase() } else { return $('#' + elmentid).get(0).tagName.toUpperCase() ; } } 
 $("[id$=" + endOfIdToMatch + "]").each(function(){ var $this=jQuery(this),ri=''; switch (this.tagName.toLowerCase()){ case 'label': ri=$this.html(); break; case 'input': if($this.attr('type')==='text'){ri=$this.val();} break; default: break; } return ri; }) 

问题是,在确定标签名称之后你打算做什么? 您可以使用额外的select器与.end()结合来过滤jquery列表,做同样的事情:

 $("[id$=" + endOfIdToMatch + "]") .find("input:text") .each(function(){ /* do something with all input:text elements */ }) .end() .find("label") .each(function(){ /* do something with label elements */ }) .end() 

如果你需要用这个特殊的元素来做更多的事情,就可以把它链接起来,就像上面的例子一样。

无论哪种情况,你都必须在each()语句中使用值来做些事情

另一个可以说更加优雅的解决scheme是为每个元素types编写两个单独的函数:

 $("input#" + id).each(function() { alert(this + " is an input"); }); $("label#" + id).each(function() { alert(this + " is a label"); });