4

我一直在使用getStyle来自 Pro JavaScript Techniques 的 John Resig 的函数来获取元素的样式:

function getStyle(elem, name) {
    // J/S Pro Techniques p136
    if (elem.style[name]) {
        return elem.style[name];
    } else if (elem.currentStyle) {
        return elem.currentStyle[name];
    }
    else if (document.defaultView && document.defaultView.getComputedStyle) {
        name = name.replace(/([A-Z])/g, "-$1");
        name = name.toLowerCase();
        s = document.defaultView.getComputedStyle(elem, "");
        return s && s.getPropertyValue(name);
    } else {
        return null;
    }
}

但是,如果未指定样式,此方法将返回元素的默认样式:

http://johnboxall.github.com/test/getStyle.html

替代文字 http://img.skitch.com/20081227-8qhxie51py21yxuq7scy32635a.png

是否可以仅获取元素的样式表指定样式(如果样式未定义,则返回 null)?

更新:

为什么我需要这样的野兽?我正在构建一个允许用户设置元素样式的小组件。可以应用的样式之一是text-align- left, center, right- 使用getStyle无样式元素默认为center. 这使得无法判断元素是否居中是因为用户希望它居中,还是因为这是默认样式而居中。

4

2 回答 2

5

是否可以仅获取元素的样式表指定样式(如果样式未定义,则返回 null)?

这实际上就是您呈现的例程所做的。问题是,在大多数情况下,大多数样式都不是未定义的——它们是由单个浏览器的内部样式表继承和/或定义的。

您可以通过大量的努力,在文档当前视图中的所有样式表中迭代定义相关样式的所有规则,针对相关元素评估它们,如果没有应用...并且如果没有应用于父级(或此特定样式未继承)...则认为它未定义。这会很慢,而且非常容易出错。我不建议尝试。

也许你最好退后一步,问问你为什么需要这样的东西?

于 2008-12-27T20:17:52.540 回答
2

也许您的组件可以包装它控制的样式?然后,当通过组件设置样式时,组件知道用户想要什么。

于 2008-12-27T20:31:20.597 回答