Je fais correspondre les éléments générés par ASP.Net par nom d'ID, mais certains éléments peuvent être affichés sous forme de zones de texte ou d'étiquettes en fonction du contexte de la page. Je dois déterminer si la correspondance est une zone de texte ou une étiquette afin de savoir si le contenu doit être obtenu par val () ou par html ().
$("[id$=" + endOfIdToMatch + "]").each(function () {
//determine whether $(this) is a textbox or label
//do stuff
});
J'ai trouvé une solution qui ne fonctionne pas, elle renvoie simplement "undefined":
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).tagName);
});
Qu'est-ce que je rate?
Juste un jQuery de trop:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert(this.tagName);
});
Considérez cette solution sans utiliser each ():
var elements = $("[id$=" + endOfIdToMatch + "]");
var vals = elements.is("input").val();
var htmls = elements.is("label").html();
var contents = vals.concat(htmls);
vous pouvez aussi utiliser quelque chose comme ceci:
if ($(this).is('input:checkbox'))
remplacez "this" par l'instance dont vous avez besoin et "case à cocher" par le type d'entrée dont vous avez besoin.
La première fois que j'ai répondu à ma propre question. Après un peu plus d'expérimentation:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).attr(tagName));
});
travaux!
dans jquery 1.6, utilisez prop ()
var el = $('body');
if (el.prop('tagName') === 'BODY') {
console.log('found body')
}
tagName quel bon conseil. Je voudrais également suggérer d'utiliser tagName.toLowerCase () car la valeur renvoyée dépend du type de document (HTML ou XML/XHTML).
Voir: http://reference.sitepoint.com/javascript/Element/tagName
C'est le meilleur moyen d'obtenir le type d'élément
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;
})
La question est de savoir ce que vous avez l'intention de faire après avoir déterminé le nom de la balise. Vous pouvez tout aussi facilement filtrer la liste de requêtes en utilisant un sélecteur supplémentaire associé à .end () pour faire la même chose:
$("[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()
Cela pourrait toujours être enchaîné si vous aviez besoin de faire plus de choses avec cette collection d'éléments particulière ... comme dans l'exemple ci-dessus.
Dans les deux cas, vous devez utiliser les valeurs dans les instructions each()
.
Une autre solution, sans doute plus élégante, consiste à écrire deux fonctions distinctes pour chaque type d'élément:
$("input#" + id).each(function() { alert(this + " is an input"); });
$("label#" + id).each(function() { alert(this + " is a label"); });