Ответ 1
Только один jQuery слишком много:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert(this.tagName);
});
Я сопоставляю созданные ASP.Net элементы по имени ID, но у меня есть некоторые элементы, которые могут отображаться как текстовые поля или метки в зависимости от контекста страницы. Мне нужно выяснить, соответствует ли совпадение текстовому поле или ярлыку, чтобы узнать, нужно ли получать содержимое с помощью val() или html().
$("[id$=" + endOfIdToMatch + "]").each(function () {
//determine whether $(this) is a textbox or label
//do stuff
});
Я нашел решение, которое не работает, оно просто возвращает "undefined":
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).tagName);
});
Что мне не хватает?
Только один jQuery слишком много:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert(this.tagName);
});
Рассмотрим это решение без использования каждого():
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'))
замените "this" любым экземпляром, который вам нужен, и установите флажок с любым типом ввода, который вам нужен.
В первый раз я ответил на свой вопрос. После немного большего количества экспериментов:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert($(this).attr(tagName));
});
работает!
tagName, какой хороший отзыв. Я хотел бы также предложить использовать tagName.toLowerCase(), поскольку возвращаемое значение зависит от типа документа (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')
}
Это лучший способ получить тип элемента
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;
})
Вопрос в том, что вы намерены делать после определения имени тега? Вы можете так же легко фильтровать список jquery, используя дополнительный селектор, объединенный с .end(), чтобы сделать то же самое:
$("[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()
Еще одно решение, возможно более элегантное, состоит в том, чтобы написать две отдельные функции для каждого типа элемента:
$("input#" + id).each(function() { alert(this + " is an input"); });
$("label#" + id).each(function() { alert(this + " is a label"); });