有没有一种快速的方法在javascript中确定祖先节点是否绝对定位而不会走遍整个树?

时间:2009-06-02 17:37:39

标签: javascript dom css

我需要确定HTML元素是否嵌套在绝对定位的元素中。 (1)*

e.g。我可以这样做:

function hasAbsoluteAncestor(obj){
  while(obj != null){
    if(window.getComputedStyle(obj,null).position == 'absolute'){
      return true;
    } else {
      obj = obj.offsetParent;
    }
  }
  return false;
}
//yes I'm aware IE doesn't play by the W3C game here...  but I have a separate
//IE fix to enable this method in IE
//I'm also aware the above checks the "test" element too (ignore that for now)

但是测试罕见情况似乎相当昂贵。我猜测95%的时间它都是相对元素的树。

是否有任何指示符表明元素嵌套在这样的层次结构中?任何人都知道的任何整洁的黑客?

更新: 根据彼得关于过早优化的评论我改变了我的逻辑以返回坐标以返回2对... 1对(x,y)直到根,另一对是第一个绝对定位的父对。它仍然“感觉”很脏,但似乎对性能没有任何重大影响。

(1)*为什么我需要这个?我在测试元素下面添加一个新的绝对定位元素,设置.left和.top属性...( 如果 )祖先是绝对定位的,是偏离该祖先,而不是从身体/视口偏移,因此我需要知道我是否需要将被测元素的位置作为坐标,对身体或特定祖先进行重新定位。

2 个答案:

答案 0 :(得分:0)

“似乎”相当昂贵?这听起来像是对我的过早优化。

你知道它很贵吗?你测试过了吗?

我实际上愿意打赌这不是非常昂贵。即使在真正复杂的具有非常深的节点的HTML页面上,我们在这里谈论什么 - 30次迭代? 40?

恕我直言,在需要时进行优化 - 即,当您的测试表明存在问题时。

答案 1 :(得分:0)

我无法想象,与向DOM做某事的开销相比,走上祖先树需要花费很多时间。

在jQuery中,如果我理解你的需要,我可能只比较直系祖先的position()和offset()。不确定这些是如何实现的,但他们利用了一些你不知道的技巧。