2010-02-10 82 views
31

有没有办法检查元素的父母,并找到第一个具有CSS背景设置,然后返回该背景值?jQuery:检查元素是否具有CSS属性

喜欢的东西:

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

UPDATE: 这是我现在使用的代码:

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

回答

45

如果它没有设置,取它会产生一个空字符串的第一个。因此 

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

编辑

有研究表明,css('background')总是产生一个空字符串,或undefined,根据浏览器。 css('background-color')将正确返回手头元素的颜色;但每个浏览器的值也不同,所以测试(IE中的transparent,Firefox/Chrome中的rgba(0,0,0,0),这两者都是指定透明的精确方式)是很麻烦的。

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

辉煌的解决方案+1 – 2010-02-10 19:17:51

+0

函数(x)中'x'究竟做了什么?是一个占位符,还是它实际上被用于某种东西? – adamyonk 2010-02-10 19:29:29

+0

试试这个:if('')alert(“The empty string is true!”); - 你也可以使用!!将布尔值转换为“truthy”值。 – Pointy 2010-02-10 19:52:29

9

我相信这样做的正确方法是检查。长度属性。

在你的情况,你会通过你所有的元素要循环,并检查符合

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

@大卫的答案是更好的,至于使用布尔而不是长度,但必须+1这个...第一个答案哪个会工作,需要一些重点。 – sberry 2010-02-10 19:15:42

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

终于很好用了!符号+1 – 2010-02-10 19:18:09

+0

您知道,Javascript中的空字符串是错误的。 – Pointy 2010-02-10 19:33:06

+0

@gaby哦我明白你的意思了Gaby;没关系!并感谢您的投票! – Pointy 2010-02-10 19:53:58

2

我想尝试这样的事:

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

如果这个确切如果从句的作品不知道,但每()应该做的伎俩。第一场比赛将填补背景变量,并在链条中穿越时忽略其他父母。

编辑:修改为正确解析css('background'),可能会发出空字符串。此外,each()不通过元素,而是索引和元素,从而利用this代替并丢弃所有参数。

-6

你可以这样做:

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

希望它可以帮助:)

+0

css不是jQuery上下文中的函数。 – Derrick 2010-08-12 11:50:43

+0

同意井架,最重要的是.has()函数将元素选择器作为其参数。 – JoseMarmolejos 2010-09-01 01:33:18

1

检索元素的背景颜色或渐变

我碰到这个际,我想申请一个背景元素没有一个(背景渐变或颜色)已经。

该函数返回的背景渐变颜色或背景的价值,如果它有一个,如果不返回false:

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

现在,如果你只是想测试一个元素是否有一个背景,你可以使用上面的函数做到这一点:

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

希望这对于某些使用渐变的人来说有点足智多谋。

相关问题