2011-01-30 16 views
84

Ho una serie di campi di input, alcuni di loro hanno etichette associate, alcuni non:jQuery - selezionare l'elemento etichetta associata a un campo di input

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

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

<input ... /> 

così, come posso selezionare l'etichetta associata per ciascun input, se esiste?

+0

Avranno sempre l'attributo 'for' impostato? – user113716

+0

no, perché alcuni dei campi non hanno etichette ... – Alex

+0

Penso che questo sia quello che stai cercando http://stackoverflow.com/questions/1186416/jquery-selector-for-the-label-of- a-checkbox :) – beon

risposta

156

Non si deve fare affidamento sull'ordine degli elementi utilizzando prev o next. Basta usare l'attributo for dell'etichetta, come dovrebbe corrispondere alla ID dell'elemento che si sta manipolando:

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

Tuttavia, ci sono alcuni casi in cui l'etichetta non avrà for set, nel qual caso l'etichetta sarà il genitore del controllo associato. Per trovarlo in entrambi i casi, è possibile utilizzare una variante di quanto segue:

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

Spero che questo aiuti!

+9

-1 per un modo maldestro di cercare il tag label genitore. Inoltre,

13

Finché ei tuoi input e label elementi sono associati con le loro id e for attributi, si dovrebbe essere in grado di fare qualcosa del genere:

$('.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! 
    } 
}); 

Se for non è impostato allora gli elementi non hanno alcuna relazione semantica l'un l'altro, e non c'è alcun vantaggio nell'usare il tag label in quell'istanza, quindi spero che la relazione venga sempre definita.

+0

Oltre all'attributo "for", la relazione semantica può essere stabilita dall'elemento input che è * all'interno * dell'etichetta - vedere la risposta di Maxim Kulkin –

42

Ci sono due modi per specificare un'etichetta per elemento:

  1. dell'etichetta Setting "per" attribuire a id dell'elemento
  2. elemento Pubblica etichetta interna

Quindi, il modo corretto di cercare l'elemento di l'etichetta è

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 
    } 
Problemi correlati