在我提出问题之前,这是违规代码:
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中的类似问题。有什么想法吗?
答案 0 :(得分:1)
这不是Dojo的怪癖,而是浏览器的工作方式。基本上,DOM可能需要一些时间来反映您的更改和重新定位元素,甚至更改布局。这就是你看到你所看到的原因。
另一个原因可能是元素的父元素。 dojo.coords()返回相对于视口的位置。如果将“true”作为第二个值传递,它将返回相对于文档根的位置。直接指定顶部/左侧并将位置更改为“绝对”会使元素相对于其父元素定位(如果它也定位(绝对,相对或固定))或文档根目录。这是一个微妙的差异,但有时它会咬人。相关参考文献:Containing Block,MSDN: position Attribute,Google 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
会从元素的位置给你一些坐标。尝试一下,看看它是否有效..