我的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);
}
我想了解这段代码如何受到父页面结构的影响 - 因为更改皮肤没有任何区别。这与页面元素的组织方式有关。
编辑:我也在寻找有关我可以尝试的代码修改的建议。
任何输入赞赏!感谢。
答案 0 :(得分:4)
这与绝对定位的工作原理有关。当一个元素被绝对定位时,它的位置(由上面代码中的top
和left
元素表示)相对于其position
样式为relative
的最近祖先absolute
}或position: relative
。在DNN 6中,模块包装器现在指定了absolute
(新操作菜单用于定位)。新控制面板可能还有一些类似的更改(如果菜单不在模块中)。
您可以尝试使用此脚本,如果元素的位置为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;
}
,则停止攀爬树:
{{1}}