菜单位置在DNN 6中搞砸了

时间:2011-09-13 19:21:56

标签: javascript dotnetnuke

我的DNN模块有一些图像按钮,单击时显示子菜单。正如预期的那样,使用javascript计算菜单的绝对位置。到目前为止一直运作良好(在DNN4和DNN5中)。但我们注意到DNN6中存在问题。菜单位置偏离了大量像素(可能是几百个)。 由于我没有编写计算代码,也不是JS专家,我无法理解DNN6是如何影响它的。 这是功能:

function AbsolutePosition(obj) {
        var pos = null;
        if(obj != null) {
            pos = new Object();
            pos.top = obj.offsetTop;
            pos.left = obj.offsetLeft;
            pos.width = obj.offsetWidth;
            pos.height= obj.offsetHeight;
            obj = obj.offsetParent;
            while(obj != null) {
                pos.top += obj.offsetTop;
                pos.left += obj.offsetLeft;
                obj = obj.offsetParent;
            }
        }
return(pos);
}

我想了解这段代码如何受到父页面结构的影响 - 因为更改皮肤没有任何区别。这与页面元素的组织方式有关。

编辑:我也在寻找有关我可以尝试的代码修改的建议。

任何输入赞赏!感谢。

1 个答案:

答案 0 :(得分:4)

这与绝对定位的工作原理有关。当一个元素被绝对定位时,它的位置(由上面代码中的topleft元素表示)相对于其position样式为relative的最近祖先absolute }或position: relative。在DNN 6中,模块包装器现在指定了absolute(新操作菜单用于定位)。新控制面板可能还有一些类似的更改(如果菜单不在模块中)。

您可以尝试使用此脚本,如果元素的位置为relativefunction AbsolutePosition(obj) { if (!obj) { return null; } var pos = { top: obj.offsetTop, left: obj.offsetLeft, width: obj.offsetWidth, height: obj.offsetHeight }, positionsToStopAt = { relative: true, absolute: true }; obj = obj.offsetParent; while(obj && !positionsToStopAt[jQuery(obj).css('position')]) { pos.top += obj.offsetTop; pos.left += obj.offsetLeft; obj = obj.offsetParent; } return pos; } ,则停止攀爬树:

{{1}}