J'ai un ensemble de champs de saisie, certains d'entre eux ont des étiquettes associées, d'autres non:
<label for="bla">bla</label> <input type="text" id="bla" />
<label for="foo">bla <input type="checkbox" id="foo" /> </label>
<input ... />
alors, comment puis-je sélectionner l'étiquette associée à chaque entrée, si elle existe?
Vous ne devriez pas vous fier à l'ordre des éléments en utilisant prev
ou next
. Utilisez simplement l'attribut for
de l'étiquette, car il devrait correspondre à l'ID de l'élément que vous manipulez actuellement:
var label = $("label[for='" + $(this).attr('id') + "']");
Cependant, dans certains cas, le libellé de l'étiquette ne sera pas défini sur for
, auquel cas il sera le parent de son contrôle associé. Pour le trouver dans les deux cas, vous pouvez utiliser une variante de ce qui suit:
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;
}
}
J'espère que ça aide!
Il existe deux manières de spécifier une étiquette pour un élément:
Donc, la bonne façon de trouver l'étiquette de l'élément est
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
}
Tant que vos éléments input
et label
sont associés à leurs attributs id
et for
, vous devriez pouvoir faire quelque chose comme ceci:
$('.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!
}
});
Si for
n'est pas défini, les éléments n'ont de toute façon pas de relation sémantique et l'utilisation de la balise label ne présente aucun avantage. Par conséquent, nous espérons que cette relation sera toujours définie.