Dojo的Javascript执行顺序问题

时间:2008-11-17 14:41:00

标签: javascript dojo

在我提出问题之前,这是违规代码:

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)就会返回一个18 x的位置,如果它位于绝对位置,则该元素将位于该位置。在我看来,对dojo.coords()的调用不应受到其下方代码的影响,但确实如此。

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

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

3 个答案:

答案 0 :(得分:1)

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

另一个原因可能是元素的父元素。 dojo.coords()返回相对于视口的位置。如果将“true”作为第二个值传递,它将返回相对于文档根的位置。直接指定顶部/左侧并将位置更改为“绝对”会使元素相对于其父元素定位(如果它也定位(绝对,相对或固定))或文档根目录。这是一个微妙的差异,但有时它会咬人。相关参考文献:Containing BlockMSDN: position AttributeGoogle doctype: position

PS:我个人依靠Dojo设置左/顶部希望它能够解决浏览器怪癖问题,并且我首先设置了这个位置:

var coords = dojo.coords(g);
g.style.position = "absolute";
dojo.marginBox(g, {l: coords.x, t: coords.y});

答案 1 :(得分: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);

干杯

答案 2 :(得分:-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";

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

祝你好运!

编辑:

哦,如果我理解,我现在可以帮助你了......好吧,因为我不知道道场,我可以向你指出类似的javascript,它会做你想做的事。

g.offsetTop

g.offsetLeft 

会从元素的位置给你一些坐标。尝试一下,看看它是否有效..