检测DOM元素的内联/块类型

abe*_*ier 21 javascript dom inline

如何检测DOM元素是块还是内嵌javascript?

例如,是否有一个函数/属性为' <a>'标签返回'inline' (或''标签'为'block' <p>)?

谢谢.

And*_*y E 30

您可以使用getComputedStyle()currentStyle获取元素的计算样式.这应该这样做:

function getDisplayType (element) {
    var cStyle = element.currentStyle || window.getComputedStyle(element, ""); 
    return cStyle.display;
}
Run Code Online (Sandbox Code Playgroud)

为了更清楚一点,计算样式包含每个样式属性的值,即使对于那些没有样式属性集的样式也是如此.这些值将是默认值,因此在非样式<a>元素的情况下,display将返回inline:

function getElementDefaultDisplay(tag) {
    var cStyle,
        t = document.createElement(tag),
        gcs = "getComputedStyle" in window;

    document.body.appendChild(t);
    cStyle = (gcs ? window.getComputedStyle(t, "") : t.currentStyle).display; 
    document.body.removeChild(t);

    return cStyle;
}
Run Code Online (Sandbox Code Playgroud)

测试了最新的Firefox,Chrome和IE7/IE8.

结果:

> getElementDefaultDisplay("a")
inline
> getElementDefaultDisplay("div")
block
Run Code Online (Sandbox Code Playgroud)

更新:编辑以优先考虑getComputedStyle()IE9中的标准符合性/ IE9,它支持这两种方法.

  • 好一个.根据规范,它总是应该是可选的,所以这是一些很好的网络公民布朗尼点. (4认同)
  • @Tim:不知道你是否知道,但在我发布这个答案后,我向Mozilla提出了关于第二个参数的错误.它已修复,并且自Firefox 4.0以来该参数已被选中.仍然值得把它放在代码中,因为网上仍然可能有少数<4.0用户. (3认同)

Tim*_*own 8

执行此操作的传统且相当丑陋的方法是查询块级元素的元素名称列表:

var blockRegex = /^(address|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i;

function isBlockLevel(el) {
    return blockRegex.test(el.nodeName);
}
Run Code Online (Sandbox Code Playgroud)

  • @jcayzac:我同意使用一个对象和`in`运算符(带有'hasOwnProperty()`检查)将会稍微减少代码,但它不会更正确.我倾向于保留downvotes以寻找不起作用或不回答问题的答案,所以我认为你的答案有点苛刻,但这是你的选择,并且感谢你抽出时间来解释. (3认同)
  • 是的,它会的.这不是Andy E的`currentStyle` /`window.getComputedStyle`方法的好解决方案,但它曾经有一个优点,它可以在几乎任何浏览器中工作.现在有了更好的浏览器,使用Andy E的方法可能是安全的.我只是作为后备选项给出了这个答案,我想删除它. (2认同)
  • @Andy E:好帖子.我已经使用了所有这三种方法,目前处于正则表达阶段,但没有最喜欢的设置.它总是令人恼火,并不简单. (2认同)