Как определить тип элемента согласованного элемента в jQuery?

Я сопоставляю созданные 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);
});

Что мне не хватает?

Ответ 1

Только один jQuery слишком много:

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

Ответ 2

Рассмотрим это решение без использования каждого():

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

Посмотрите на документацию.

Ответ 3

вы также можете использовать что-то вроде этого:

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

замените "this" любым экземпляром, который вам нужен, и установите флажок с любым типом ввода, который вам нужен.

Ответ 4

В первый раз я ответил на свой вопрос. После немного большего количества экспериментов:

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

работает!

Ответ 5

tagName, какой хороший отзыв. Я хотел бы также предложить использовать tagName.toLowerCase(), поскольку возвращаемое значение зависит от типа документа (HTML или XML/XHTML).

Смотрите: http://reference.sitepoint.com/javascript/Element/tagName

Ответ 6

в jquery 1.6 используйте prop()

Пример

var el = $('body');

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

Ответ 7

Это лучший способ получить тип элемента

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() ; 
    }
}

Ответ 8

$("[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()

Ответ 9

Еще одно решение, возможно более элегантное, состоит в том, чтобы написать две отдельные функции для каждого типа элемента:

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