2010-02-10 24 views
31

Gibt es eine Möglichkeit, ein Elternelement zu überprüfen und die erste zu finden, die einen CSS-Hintergrund gesetzt hat und dann diesen Hintergrundwert zurückgeben?jQuery: überprüfen, ob Element CSS-Attribut hat

Etwas wie:

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

UPDATE: Dies ist der Code, den ich jetzt bin mit:

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

Antwort

45

trifft Wenn es nicht gesetzt ist, holen es wird eine leere Zeichenkette ergeben. Daher  

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

EDIT

Einige Untersuchungen zeigen, dass css('background') wird immer eine leere Zeichenfolge ergeben, oder undefined, je nach Browser. css('background-color') wird die Farbe des Elements korrekt zurückgeben; aber auch andere Werte für jeden Browser, so ist es mühsam zu testen (transparent in IE, in Firefox/Chrome zum Beispiel, beide sind genaue Möglichkeiten der Angabe transparent).

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

brilliante Lösung +1 –

+0

was genau macht x in Funktion (x)? ist das ein Platzhalter oder wird er tatsächlich für etwas verwendet? – adamyonk

+0

Versuchen Sie Folgendes: if ('') alert ("Die leere Zeichenfolge ist wahr!"); - Sie können auch einen "truthy" -Wert in boolean mit !! umwandeln. – Pointy

9

ich die richtige Art und Weise glauben, dies zu tun ist, um die .length Eigenschaft zu überprüfen.

In Ihrem Fall würden Sie durch alle Ihre Elemente Schleife wollen und prüfen, ob die erste, die

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

@ Davids Antwort ist besser, so weit wie boolean anstatt Länge zu verwenden, musste aber +1 zu ... erste Antwort, die funktioniert und braucht einige Rep-Punkte. – sberry

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

endlich eine gute nutzung der !! Notation +1 –

+0

Eine leere Zeichenfolge ist falsch in Javascript, weißt du. – Pointy

+0

@gaby oh ich sehe was du meinst Gaby; Vergiss es! Und danke für die Abstimmung! – Pointy

2

würde ich so etwas wie dies versuchen:

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

nicht sicher, ob dies genau if-Klausel funktioniert, aber die each() sollte es tun. Die erste Übereinstimmung füllt die Hintergrundvariable und ignoriert den Rest der Eltern, während sie sich in der Kette fortbewegt.

Edit: Geändert, um css('background') korrekt zu lösen, die eine leere Zeichenfolge ausgeben kann. Außerdem übergibt each() nicht das Element, sondern index und element, verwenden Sie also stattdessen this und verwerfen Sie alle Parameter.

-6

Man könnte so etwas wie tun:

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

Hoffe, es hilft:)

+0

css ist keine Funktion außerhalb des jQuery-Kontextes. – Derrick

+0

Vereinbaren Sie mit Derrick, obendrein nimmt die .has() - Funktion einen Elementselektor als seinen Parameter. – JoseMarmolejos

1

Element Hintergrundfarbe Abrufen oder Gradienten

ich auf diese kam, als ich einen Hintergrund für Elemente anzuwenden versuchte, das hatte noch keinen (Hintergrundfarbverlauf oder Farbe).

Diese Funktion gibt den Wert des Hintergrundgradienten oder Hintergrundfarbe, wenn sie eine hat und gibt false zurück, wenn es nicht der Fall ist:

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

Nun, wenn Sie einfach testen wollen, ob ein Element hat einen Hintergrund, Sie können dies mit der obigen Funktion tun:

Hoffentlich ist dies etwas einfallsreich für jemanden arbeiten mit Farbverläufen.

Verwandte Themen