【问题标题】:Any idea why the X,Y position of this element is 0,0?知道为什么这个元素的 X,Y 位置是 0,0 吗?
【发布时间】: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


【解决方案1】:

这里只是一个猜测,但如果元素显示样式设置为“无”,element.getOffsetParent 将返回 null(以及我认为 getOffsetLeft/Right 返回 0)。

您可以使用以下方法检查计算的样式:

document.defaultView.getComputedStyle(document.getElementById("a"), "").display

【讨论】:

  • 这可能是真的,但是我试图找到的所有元素都有 display: block;使用您的代码 sn-p 确认它。
  • 猜错了 :) 也许您可以发布一些代码来重现该问题:即如何动态添加元素,何时调用 findPos() 例程。
  • 然后会再猜测一下,因为我没有 Firefox 扩展来测试这个......也许你可以尝试使用 gBrowser.contentDocument.createElement('div') 而不是文档。创建元素()。我知道在一个文档上创建一个元素并将其添加到另一个文档可能会产生一些奇怪的副作用。但是,当我尝试与您的代码类似的东西并在 IFRAME(而不是扩展名)上创建元素时,它确实起作用了。
【解决方案2】:

所以我在编写更多详细信息时发现了这个问题,希望这有助于某人试图弄清楚为什么一个元素在从 Firefox 扩展(在侧边栏或工具栏)。

问题在于这行无害的代码:

var mydiv = document.createElement('div');

我们正在浏览器 chrome 的文档中创建 mydiv。我们可以将它附加到 gBrowser 中的元素上,它会在视觉上显示出来,但是我们 findpos 给了我们 0,0。

但是,如果我们将其更改为:

var mydiv = gBrowser.contentDocument.createElement('div');

我们得到了 findpos 的正确值。

【讨论】:

  • 如果有人能指出任何说明这种性质的文件,我将不胜感激,以防止花费 DAYS 时间解决此错误引起的所有附带问题。
  • 哎呀,在我的其他评论中猜到了,但为时已晚 2 天!很高兴您找到了解决方案。也没有发现任何有关该问题的记录。
  • 感谢 Amitay Dobo 坚持不懈地试图帮助我解决这个问题,如果你没有向我询问更多信息,我仍然会摸不着头脑。
猜你喜欢
  • 1970-01-01
  • 2022-08-02
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多