JQuery - выберите связанный элемент метки в поле ввода

У меня есть набор полей ввода, некоторые из них связаны с метками, а некоторые нет:

<label for="bla">bla</label> <input type="text" id="bla" />

<label for="foo">bla <input type="checkbox" id="foo" /> </label>

<input ... />

так, как я могу выбрать соответствующую метку для каждого входа, если она существует?

Ответ 1

Вы не должны полагаться на порядок элементов, используя prev или next. Просто используйте атрибут for метки, так как он должен соответствовать идентификатору элемента, который вы сейчас управляете:

var label = $("label[for='"+$(this).attr('id')+"']");

Однако есть случаи, когда метка не будет иметь набор for, и в этом случае метка будет родительским элементом связанного с ней элемента управления. Чтобы найти его в обоих случаях, вы можете использовать следующий вариант:

var label = $('label[for="'+$(this).attr('id')+'"]');

if(label.length <= 0) {
    var parentElem = $(this).parent(),
        parentTagName = parentElem.get(0).tagName.toLowerCase();

    if(parentTagName == "label") {
        label = parentElem;
    }
}

Надеюсь, это поможет!

Ответ 2

Существует два способа указания метки для элемента:

  • Установка метки "для" атрибута на идентификатор элемента
  • Размещение элемента внутри метки

Итак, правильный способ найти метку элемента

   var $element = $( ... )

   var $label = $("label[for='"+$element.attr('id')+"']")
   if ($label.length == 0) {
     $label = $element.closest('label')
   }

   if ($label.length == 0) {
     // label wasn't found
   } else {
     // label was found
   }

Ответ 3

До тех пор, пока ваши элементы input и label будут связаны их атрибутами id и for, вы должны сделать что-то вроде этого:

$('.input').each(function() { 
   $this = $(this);
   $label = $('label[for="'+ $this.attr('id') +'"]');
   if ($label.length > 0 ) {
       //this input has a label associated with it, lets do something!
   }
});

Если for не задано, элементы в любом случае не имеют семантического отношения друг к другу, и нет никакой пользы от использования тега метки в этом экземпляре, поэтому, надеюсь, вы всегда будете иметь это отношение.