我的GXT菜单(com.extjs.gxt.ui.client.widget.menu)存在奇怪的对齐问题。只有当scorllbar可见时,它才能正确地与MenuBarItem(也是com.extjs.gxt.ui.client.widget.menu)正确对齐。您可以在下面的图片中看到两个案例(Chrome 33):
在自定义类MenuBarImpl的expand事件中调用对齐,扩展MenuBar
public class MenuBarImpl extends MenuBar implements IMenuBarImpl {
(...)
@Override
protected void expand(MenuBarItem menuBarItem, boolean selectFirst) {
MenuBarItemImpl item = (MenuBarItemImpl) menuBarItem;
(...)
item.getMenu().show(item.getElement(), "tl-bl?", new int[] {1, 0});
(...)
}
(...)
}
调试时我发现问题似乎是JavaScript函数getAbsoluteLeft()(com.google.gwt.dom.client.DomImpl)。令我惊讶的是,它为两个场景返回相同的左坐标:当滚动条可见时和不存在时。看它的短体(见下文),它构建了2个DOM属性offsetLeft和offsetParent的值。因此,我使用Chrome开发者工具检查了这两种情况的值。值很好 - 它们应该为getAbsoluteLeft()函数的调用产生不同的结果。
public native int getAbsoluteLeft(Element elem) {
var left = 0;
var curr = elem;
// This intentionally excludes body which has a null offsetParent.
while (curr.offsetParent) {
left -= curr.scrollLeft;
curr = curr.parentNode;
}
while (elem) {
left += elem.offsetLeft;
elem = elem.offsetParent;
}
return left;
}
我特别感到困惑的是,当滚动条可见而不是滚动条时,结果是正确的。有谁知道解决它的方法吗?