-1

在我问我的问题之前,这是有问题的代码:

var coords = dojo.coords(g);
g.style.left = coords.x + "px";
g.style.top = coords.y + "px";
g.style.position = "absolute";

现在想象这g是一个相对定位的元素,x位置为 70,y位置为 30。如果我注释掉上面代码的最后一行,这就是dojo.coords(g)给我的。但是,只要我添加最后一行,就会dojo.coords(g)返回一个x18 的位置,如果它是绝对定位的,这就是元素所在的位置。在我看来,调用dojo.coords()不应该受到它下面的代码的影响,但确实如此。

我也看到了同样的问题dojo.require(),如果我在加载它的函数调用之前直接调用它,我会得到一个给定函数的未定义错误。

我在 Firefox 3 中进行测试,但我也注意到 Safari 3 中的类似问题。有什么想法吗?

4

3 回答 3

1

这不是 Dojo 的怪癖,而是浏览器的工作方式。基本上,DOM 可能需要一些时间来反映您的更改和重新定位元素,甚至更改布局。这就是为什么你看到你所看到的。

另一个原因可能在您的元素的父级中。dojo.coords() 返回相对于视口的位置。如果您将“true”作为第二个值传递,它将返回相对于文档根的位置。直接分配 top/left 并将位置更改为“绝对”会使元素相对于其父元素(如果它也被定位(绝对、相对或固定))或文档根定位。这是一个微妙的区别,但有时它会咬人。相关参考:包含块MSDN:位置属性谷歌文档类型:位置

PS:就我个人而言,我依靠 Dojo 来设置 left/top,希望它能针对浏览器的怪癖做正确的事情,我首先设置了位置:

var coords = dojo.coords(g);
g.style.position = "absolute";
dojo.marginBox(g, {l: coords.x, t: coords.y});
于 2008-11-24T04:47:19.130 回答
0

我仍然希望有人解释为什么会这样,但这里有一个解决方案:

var coords = dojo.coords(g);
g.style.left = coords.x + "px";
g.style.top = coords.y + "px";
setTimeout(function(h) {
    h.style.position = "absolute";
}, 0, g);

干杯

于 2008-11-17T19:03:50.667 回答
-1

很抱歉没有回答你的问题,(因为我不知道 dojo)但是除非 coords.x 和 coords.y 返回一个字符串,否则你的函数中有错误,

g.style.left = coords.x + "px";

g.style.top = coords.y + "px";

您需要始终将字符串传递给样式,因此还要添加以下内容:

g.style.left = parseInt(coords.x) + "px";
g.style.top = parseInt(coords.y) + "px";

你会惊讶于这种错误有多少次让我头晕目眩。关于答案,对不起,我帮不了你。

祝你好运!

编辑:

哦,如果我明白了,我现在可以帮助你.. 好吧,因为我不知道 dojo,所以我可以向你指出一个类似的 javascript,它可以满足你的需求。

g.offsetTop

g.offsetLeft 

将为您提供元素位置的坐标。尝试一下,看看它是否有效..

于 2008-11-17T14:46:58.830 回答