2011-12-20 8 views

Respuesta

10
$("#3").parents().filter(function() { 
    return $(this).css("display") === "block"; 
}).first() 

http://jsfiddle.net/DFURw/

+0

¿Por qué la comparación estricta ('===') es importante en este caso? – sbichenko

+2

@exizt Para cerrar las herramientas de calidad de código que no se dan cuenta de dónde === es redundante; P – Esailija

+0

Es un código bonito y ordenado, pero una advertencia es que esto buscará todos los padres incluso cuando el primero es un elemento de bloque. – Dwayne

1

Hmm. . . Creo que sería

 

$('#3').parents().each(function(){ 

    if ($(this).css('display') == 'block') { 
     console.log(this); 
     //do your stuff if the element is block 
     return false; // bail out 
    } 

}); 
 
0

Esta solución es la más corta y no buscar ningún elemento más de la cuenta:

var $el = $('#3'); 
while ($el.css('display') !== 'block' && ($el = $el.parent().length)){} 

Cuando terminó, $ EL será o bien un elemento principal que es display: block , o si no hay ninguno, será un elemento jQuery sin elementos.

0

According to W3C, a block level element can have a display of anything whose contents are processed like a table or a block. Entonces, sin más preámbulos, aquí está mi solución. Creo que encontrará que es mucho más rápido que las soluciones anteriores.

var elementBlockDisplays={"run-in":1,"block":1,"table-row-group":1,"table-column":1,"table-column-group":1,"table-header-group":1,"table-footer-group":1,"table-row":1,"table-cell":1,"table-caption":1,"inline-block:":1}; 

var getBlockParent = function(theElement){ 
    var cur=theElement.parentElement; 
    while (cur&&!elementBlockDisplays[getComputedStyle(cur).display]) 
     cur=cur.parentElement; 
    return cur; 
}; 
Cuestiones relacionadas