Ich stelle ASP.Net-generierte Elemente anhand des ID-Namens ab, habe jedoch einige Elemente, die je nach Seitenkontext als Textfelder oder Beschriftungen dargestellt werden können. Ich muss herausfinden, ob die Übereinstimmung mit einem Textfeld oder einer Beschriftung besteht, um zu wissen, ob der Inhalt von val () oder von html () abgerufen werden soll.
$("[id$=" + endOfIdToMatch + "]").each(function () {
//determine whether $(this) is a textbox or label
//do stuff
});
Ich habe eine Lösung gefunden, die nicht funktioniert, sie gibt nur "undefined" zurück:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).tagName);
});
Was vermisse ich?
Nur eine Frage zu viel:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert(this.tagName);
});
Betrachten Sie diese Lösung, ohne each () zu verwenden:
var elements = $("[id$=" + endOfIdToMatch + "]");
var vals = elements.is("input").val();
var htmls = elements.is("label").html();
var contents = vals.concat(htmls);
sie könnten auch so etwas verwenden:
if ($(this).is('input:checkbox'))
ersetzen Sie "this" durch die Instanz, die Sie benötigen, und "Checkbox" durch den von Ihnen benötigten Eingabetyp.
Zum ersten Mal habe ich meine eigene Frage beantwortet. Nach etwas mehr Experimenten:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).attr(tagName));
});
funktioniert!
in jquery 1.6 use prop ()
var el = $('body');
if (el.prop('tagName') === 'BODY') {
console.log('found body')
}
tagName was für ein schöner Tipp. Ich möchte auch die Verwendung von tagName.toLowerCase () vorschlagen, da der zurückgegebene Wert vom Dokumenttyp (HTML oder XML/XHTML) abhängt.
Siehe: http://reference.sitepoint.com/javascript/Element/tagName
Dies ist der beste Weg, um den Elementtyp abzurufen
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;
})
Die Frage ist, was wollen Sie tun, nachdem Sie den Tagnamen bestimmt haben? Sie können die Jquery-Liste genauso einfach filtern, indem Sie einen zusätzlichen Selektor in Kombination mit .end () verwenden, um dasselbe zu tun:
$("[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()
Dies könnte immer noch verkettet werden, wenn Sie weitere Elemente mit dieser bestimmten Elementkollektion ausführen müssen ... genau wie im obigen Beispiel.
In beiden Fällen müssen Sie etwas mit den Werten tun, wenn Sie sich in den each()
-Anweisungen befinden
Eine noch elegantere Lösung besteht darin, für jeden Elementtyp zwei separate Funktionen zu schreiben:
$("input#" + id).each(function() { alert(this + " is an input"); });
$("label#" + id).each(function() { alert(this + " is a label"); });