2010-02-10 15 views
31

¿Hay alguna manera de verificar un elemento padres y encontrar el primero que tiene un fondo CSS establecido y luego devolver ese valor de fondo?jQuery: compruebe si el elemento tiene el atributo CSS

Algo así como:

var background = $('element').parents().has(css('background')); 

ACTUALIZACIÓN: Este es el código que estoy usando ahora:

jQuery.fn.getBg = function(){ 
    var newBackground = this.parents().filter(function() { 
     return $(this).css('background-color').length > 0; 
    }).eq(0).css('background-color'); 
    $(this).css('background-color',newBackground); console.log("new background is: "+newBackground); 
}; 

Respuesta

45

Si no se establece, ir a buscar se producirá una cadena vacía. Por lo tanto  

var bg = ('element').parents().filter(function() { 
    return $(this).css('background').length > 0; 
}).eq(0) 

EDITAR

Algunas investigaciones muestran que css('background') hará siempre dió una cadena vacía, o undefined, dependiendo del navegador. css('background-color') devolverá correctamente el color del elemento en cuestión; sino también valores diferentes para cada navegador, por lo que es difícil probar (transparent en IE, rgba(0,0,0,0) en firefox/chrome, por ejemplo, ambas son formas precisas de especificar transparente).

jQuery.fn.getBg = function() { 
    return $(this).parents().filter(function() { 
     // only checking for IE and Firefox/Chrome. add values as cross-browser compatibility is required 
     var color = $(this).css('background-color'); 
     return color != 'transparent' && color != 'rgba(0, 0, 0, 0)'; 
    }).eq(0).css('background-color'); 
}; 
+0

solución brillante +1 –

+0

¿qué está haciendo exactamente 'x' en la función (x)? ¿Es eso un marcador de posición o se está usando para algo? – adamyonk

+0

Pruebe esto: if ('') alerta ("La cadena vacía es verdadera!"); - también puedes convertir un valor "verídico" a booleano con !!. – Pointy

9

Creo que la manera correcta de hacer esto es comprobar la propiedad .length.

En su caso Lo que quiere recorrer todos sus elementos y comprobar si el primero que cumple

.css('background').length != 0 
+0

@ La respuesta de David es mejor, en cuanto a utilizar como booleano en lugar de longitud, pero tuvo que hacer +1 para ... primera respuesta que funcionará y necesita algunos puntos de repetición. – sberry

5
$('selector').parents().filter(function() { return !!$(this).css('background'); }); 
+3

al fin un buen uso de la !! notación +1 –

+0

Una cadena vacía es falsa en Javascript, ya sabes. – Pointy

+0

@gaby oh veo lo que querías decir Gaby; ¡no importa! ¡Y gracias por la votación! – Pointy

2

me gustaría probar algo como esto:

var background = 0; 
$('element').parents().each(function() { 
    if (!background && ((e = $(this).css('background')).length > 0)) background = e; 
}); 

No estoy seguro si esta cláusula si funciona-exacta, pero el each() debe hacer el truco. La primera coincidencia llenará la variable de fondo e ignorará al resto de los padres mientras recorre la cadena.

Editar: Enmendado para resolver css('background') correctamente que puede emitir una cadena vacía. Además, each() no pasa el elemento, sino el índice y el elemento, por lo tanto, haga uso de this y descarte todos los parámetros.

-6

Se podría hacer algo como:

$('#test').parents().has(css('background')).filter(':first'); 

creo que sirve:)

+0

css no es una función del contexto jQuery. – Derrick

+0

De acuerdo con derrick, además de eso, la función .has() toma un selector de elementos como su param. – JoseMarmolejos

1

Recuperar el color de fondo del elemento o gradiente

me encontré con este ya que estaba tratando de aplicar un fondo a los elementos que no tenía uno (gradiente de fondo o color) ya.

Esta función devuelve el valor de la pendiente de fondo o color de fondo si tiene uno y devuelve falso si no lo hace:

jQuery.fn.getBg = function() { 
    var color = $(this).css('background-color'); 
    var image = $(this).css('background-image'); 

    if (color != 'transparent' && color != 'rgba(0, 0, 0, 0)') { 
    return color; 
    } 
    if (image != 'none') { 
    return image; 
    } 
    return false; 
}; 

Ahora si simplemente desea probar si un elemento tiene un fondo, usted puede hacer esto utilizando la función anterior:

var curBack = $(this).getBg(); 
if (curBack) { /* Element has a background */ } 
else { /* Element doesn't have a background */ } 

Esperemos que esto es algo ingenioso para alguien que trabaja con gradientes.

Cuestiones relacionadas