Javascript DNN 6中的菜单位置混乱

Javascript DNN 6中的菜单位置混乱,javascript,dotnetnuke,Javascript,Dotnetnuke,我的DNN模块有一些图像按钮,单击时显示子菜单。正如预期的那样,菜单的绝对位置是使用javascript计算的。到目前为止,这种方法在DNN4和DNN5中运行良好。但我们注意到DNN6中存在一个问题。菜单位置关闭了大量像素,可能有几百个。 因为我没有编写计算代码,我也不是JS专家,所以我无法理解DNN6是如何影响它的。 以下是函数: function AbsolutePosition(obj) { var pos = null; if(obj != null) {

我的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);
}
我想了解这段代码是如何受到父页面结构的影响的——因为更改外观没有任何区别。这与页面元素的组织方式有关

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


欢迎任何意见!谢谢。

这与绝对定位的工作原理有关。当元素处于绝对位置时,上面代码中顶部和左侧元素指示的位置相对于其最近的祖先,位置样式为相对或绝对。在DNN 6中,模块包装器现在在其上指定了position:relative,新操作菜单用于定位。如果菜单不在模块中,新控制面板也可能会有一些类似的更改

您可以尝试此脚本,如果元素的位置为绝对或相对,则该脚本将停止爬树:


这与绝对定位的工作原理有关。当元素处于绝对位置时,上面代码中顶部和左侧元素指示的位置相对于其最近的祖先,位置样式为相对或绝对。在DNN 6中,模块包装器现在在其上指定了position:relative,新操作菜单用于定位。如果菜单不在模块中,新控制面板也可能会有一些类似的更改

您可以尝试此脚本,如果元素的位置为绝对或相对,则该脚本将停止爬树:


谢谢虽然我不完全理解position:relative的含义,但您能建议我对代码进行任何修改吗?谢谢!!虽然我不完全理解position:relative的含义,但您能建议我对代码进行任何修改吗?
function 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;
}