【发布时间】:2011-04-25 01:55:14
【问题描述】:
我的扩展中有以下 javascript 函数:
function findPos(obj) {
var curleft = curtop = 0;
if (obj.offsetParent) {
curleft = obj.offsetLeft
curtop = obj.offsetTop
while (obj = obj.offsetParent) {
curleft += obj.offsetLeft
curtop += obj.offsetTop
}
}
return [curleft,curtop];
而我的简化html示例如下:
<span id="a"></span>
<span id="b"></span>
<span id="c"></span>
<span id="d"></span>
在每个 span 标签中我附加一个子元素
<div id="a2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div>
<div id="b2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div>
<div id="c2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div>
<div id="d2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div>
现在当页面是静态的(也就是说,如果我手动编辑 html 以拥有 div 子级),findPos 会为 document.getElementById('a') 和 a2 返回正确的 curleft 和 curtop,但是如果我创建div 从扩展中动态添加并将其附加到跨度,findPos 在新元素上返回 0,0。
有什么想法吗?
我添加 div 并从 firefox 侧边栏的上下文中运行 findPos 代码,如下所示:
var mydiv = document.createElement('div');
mydiv.setAttribute('style',
'显示:块;位置:绝对;高度:50 像素;宽度:50px;边框:1px 实心#abcdef z-index:9999998;'); mydiv.id = 'a2' var myspan = gBrowser.contentDocument.getElementById('a'); myspan.appendChild(mydiv);
其中 gBrowser 定义为:
// For accessing browser window from sidebar code.
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
var gBrowser = mainWindow.gBrowser;
我已经尝试将 findPos 代码添加到页面本身,但是同样的事情。
【问题讨论】:
-
您确定没有具有重复 ID 的元素吗?常见错误(虽然我不明白为什么它如此常见,但没有人知道 ID 是什么?!)。
-
阳性。在重复 ID 的情况下,Firefox 总是返回第一个(至少从我在 3.5-4.0b7 中看到的)
-
与您的问题无关,但我使用几乎相同的代码 sn-p (顺便说一句,可以缩短几行:quirksmode.org/js/findpos.html),我注意到 curtop 是一个 GLOBAL 变量.因为它没有用
var声明。不太可能导致问题,但至少应该在 Firefox 中引发警告。 (就我而言,它确实引起了问题,因为我使用了top而不是curtop,这已经是一个全局变量。 -
@MatrixFrog,我从 quirksmode 获取代码并声明了两个变量。
-
如果您的代码是您在上面发布的,那么不,您没有。
标签: javascript firefox firefox-addon