2009-09-28 9 views
5

Ho questo semplice codice HTML generato da ASP classico:Perché il mio nascosto <tr> non è davvero nascosto?

<table> 
    <tr class="trClass"> 
    <td>Hello </td> 
    </tr> 
    <tr class ="trClass"> 
    <td>World!</td> 
    </tr> 
</table> 

Se ho impostato il tr appartenenti a Ciao da nascondere() utilizzando jQuery si nasconde. Buona!

Ma, quando uso questo $ ('. TrClass: visible'). Each (function() {alert ('visible')}); mostra l'output 'visible' due volte.

Perché è questo?

Il mio problema qui è che im filtrare una tabella su una colonna con una casella di selezione. Ma dopo il filtraggio ho bisogno di eseguire alcuni calcoli su quelle file che sono visibili nella tabella, ma ottengo tutte le righe in questo momento.

Qualche idea?

/Daniel

+0

puoi fornire una pagina di dimostrazione? –

+0

Quale browser? ? –

+0

Che versione di jQuery? 1.3.2? –

risposta

13

Il selettore :visible non verifica la proprietà display stile, che si desidera utilizzare :hidden invece, the 1.3.2 release notes say:

... se CSS display del vostro elemento è "none", o uno qualsiasi dei suoi genitori/antenati: Il display dell'elemento è "none" o se la larghezza dell'elemento è 0 e l'altezza dell'elemento è 0, quindi un elemento sarà segnalato come nascosto.

Questi saranno correttamente selezionare le righe visibili:

$('.trClass:not(:hidden)').each(function() { 
    alert('visible'); 
}); 

o:

$('.trClass').each(function() { 
    if(!$(this).is(':hidden')) { 
     alert('visible'); 
    } 
}); 

o:

$('.trClass').filter('not:(:hidden)').each(function() { 
    alert('visible'); 
}); 

hide imposta lo stile di display="none". Il release notes per jQuery 1.3.2 dicono anche:

In jQuery 1.3.2 un elemento è visibile se il suo browser-riferito offsetWidth o offsetHeight è maggiore di 0.

quindi credo che in In questo caso, il selettore :visible erroneamente non corrisponde a nulla perché le righe non occupano nessuno spazio in base ai calcoli eseguiti, nonostante la loro proprietà CSS display sia non impostata su none. Al contrario, :hidden corrisponde correttamente agli elementi con style="display:none", pertanto il test per gli elementi non :hidden funziona correttamente.

+0

Né ': hidden' né': visible' controllano la proprietà display. Controllate voi stessi la fonte: http://dev.jquery.com/browser/tags/1.3.2/src/selector.js#L957 –

+0

È un bug legittimo secondo lo stesso Resig: http://www.nabble.com/ Ri: -Bug-with-: hidden-selector-e-tbody-in-Internet - Explorer-p24631644s27240.html –

+0

@crescentfresh - grazie per quello. Ho aggiornato la mia risposta. – karim79

2

Non sicuro se questo è importante, ma non nasconde() impostare display: none; e non visible: hidden? Significa che una riga nascosta è ancora visibile, ma non viene visualizzata ...

0

molto probabilmente il tuo trClass entra in collisione con il display: nessuno che .hide() imposta. quando un tag ha sia l'attributo di classe che l'attributo di stile solo su verrà applicato. dovresti vedere da vicino il tuo trClass ed estrarre il display: cose da esso.

4

You've found a legitimate bug. È rotto in 1.3.2 ma ora fixed in trunk.

According to Resig:

abbiamo già guardiamo per il caso di 'tr' , che ha lo stesso problema, in IE

pensiero vuoi sapere ...

+0

e cosa ha causato l'errore? – xxxxxxx

+0

@ spx2: regressione in 1.3.2. Le versioni precedenti hanno controllato la proprietà 'display'. 1.3.2 ha usato un trucco per controllare la [mancanza di] dimensioni dell'elemento. Vedi la prima citazione di @ karim79. –

+1

@ spx2 - Come al solito, erano programmatori. – aehiilrs

Problemi correlati