为什么getComputedStyle不能使用伪类,例如:hover?

时间:2012-07-15 20:54:05

标签: javascript dom css-selectors

根据documentation,函数window.getComputedStyle应该能够获得计算的伪类样式,如:hover。

它也在another question

中作为答案解释

但正如最后一条评论在该问题中所说的那样,事实上它根本不起作用,它只返回正常的风格,而不是:悬停风格。你可以在this jsfiddle中看到自己。警报返回红色,而不是绿色。

documentation on developer.mozilla.org也有一个示例,但这也不起作用 - 请参阅here

this question中,回答者在评论中指出它根本不起作用,但没有给出解释。

在函数返回正确的值之前,是否必须完全呈现样式表?我试过设置一些延迟,但似乎没有任何工作。

我尝试过最新的Firefox,Chrome和IE浏览器。有人知道为什么这个功能没有按预期工作吗?

2 个答案:

答案 0 :(得分:13)

var style = window.getComputedStyle(element[, pseudoElt]);

其中pseudoElt"一个字符串,指定要匹配" 的伪元素。伪元素类似于::before::after,它们是由CSS样式生成的元素。 :hover:visited或其他类似效果是pseuodo- 。他们不会创建新元素,但会对元素应用专门的类样式。

无法获得伪类的计算样式,至少不能使用getComputedStyle。然而,您可以遍历CSS规则并尝试找到合适的选择器,但我不建议您这样做,因为有些浏览器不会遵循DOM-Level-2-Style规则而你会必须检查哪个规则会影响您的特定元素:

/* Style */
p a:hover{ color:yellow; background:black;}
p > a:hover{ color:green; background:white;}
p > a+a:hover{ color:fuchsia; background:blue;}
// JS
var i,j, sel = /a:hover/;
for(i = 0; i < document.styleSheets.length; ++i){
    for(j = 0; j < document.styleSheets[i].cssRules.length; ++j){    
        if(sel.test(document.styleSheets[i].cssRules[j].selectorText)){
            console.log(
                document.styleSheets[i].cssRules[j].selectorText,
                document.styleSheets[i].cssRules[j].style.cssText
            );
        }
    }
}
Result:
p a:hover color: yellow; background: none repeat scroll 0% 0% black; 
p > a:hover color: green; background: none repeat scroll 0% 0% white;
p > a + a:hover color: fuchsia; background: none repeat scroll 0% 0% blue;

另见:

答案 1 :(得分:0)

请注意,至少对于启用了远程调试端口的Chrome,有一种方法可以执行此操作。基本上你需要使用WebSocket,连接到远程调试器url,然后发出以下命令:

TStringList

然后您可以使用常规的getComputedStyle或CSS.getComputedStyleForNode调试器API。