【问题标题】:Pure JavaScript function similar to jQuery.offset()?类似于 jQuery.offset() 的纯 JavaScript 函数?
【发布时间】:2011-09-02 15:23:00
【问题描述】:

在俄罗斯社交网络 Ok.ru 的一个小型 iframe-application 中,我使用以下调用来调整 iframe 的大小:

<div id="fb-root"></div> 
<script src="http://api.odnoklassniki.ru/js/fapi.js" 
type="text/javascript"></script> 
<script type="text/javascript"> 
FAPI.init("http://api.odnoklassniki.ru/", "XXX_YYY",
function() {
        alert("clientHeight " + document.getElementById("fb-root").clientHeight);
        alert("offsetHeight " + document.getElementById("fb-root").offsetHeight);
        FAPI.UI.setWindowSize(720, 1200);
}, function(error){
        alert("API initialization failed");
});
</script> 
</body> 
</html>

即iframe-height 当前被硬编码为 1200

它工作正常,但我想改用 #fb-root 元素的高度/位置。

有没有人想知道,这里可以使用哪个 JavaScript 或 CSS 函数 - 如果我不想只为一个 $(#fb-root).offset() 包含 jQuery strong> 打电话?

我还查看了他们的库http://api.odnoklassniki.ru//js/fapi.js,但它不包含此类功能。

更新

我在上面的源代码中添加了两个警报调用,但它们只打印

clientHeight 0
offsetHeight 0

更新

以下代码似乎适用于我现在在 Google Chrome 和 Mozilla Firefox 中的 iframe-app,无论我添加了多少
来测试它。但是使用 Internet Explorer 时,它无法调整窗口大小,并且警报显示 top=1107 而不是 Google Chrome 中的 top=1157,因此底部的 html 表格被切断:

... here my flash game + html table with players ...
<br>
<br>
<br>
<br>
<br>
<br>
<div id="fb-root"></div>
<script src="http://api.odnoklassniki.ru/js/fapi.js" type="text/javascript"></script>
<script type="text/javascript">
FAPI.init("http://api.odnoklassniki.ru/", "XXX_YYY",
function() {
        var top = findTop(document.getElementById("fb-root"));
        FAPI.UI.setWindowSize(720, Math.max(top, 1200));
}, function(error){
        alert("API initialization failed");
});
function findTop(obj) {
        if(!obj) return 0;
        return obj.offsetTop + findTop(obj.offsetParent);
}
</script>

</body>
</html>

【问题讨论】:

  • 请不要发布 1.) 需要注册 2.) 是俄语的网址... :)) 这没什么用。
  • Facebook 问题呢?这里有很多,需要注册。
  • 但是每个人都在 FB 上,所以如果你想帮助,它并不需要你注册。它当然不是俄语(仅限)。 :)
  • 不管是俄罗斯、匈牙利还是美国社交网络。我试图解决 JavaScript/iframe 问题,并在开始和以后提供了足够的信息。如果您在 Stackoverflow 上查看我的其他问题,您会发现,我总是这样做(提供足够的信息和测试用例,并在提出任何问题时回复每条评论)。

标签: javascript iframe social-networking


【解决方案1】:

查看code in jquery,偏移量是这样计算的:

function getOffset(element)
{
    if (!element.getClientRects().length)
    {
      return { top: 0, left: 0 };
    }

    let rect = element.getBoundingClientRect();
    let win = element.ownerDocument.defaultView;
    return (
    {
      top: rect.top + win.pageYOffset,
      left: rect.left + win.pageXOffset
    });   
}

【讨论】:

  • 非常感谢。它节省了我的很多时间
【解决方案2】:

Quirksmode 有一个 JavaScript 教程/函数,展示了如何找到元素 here 的坐标

一旦你有了它的坐标,你就可以使用 iframe 的 offsetHeight 属性来读取它的高度。

【讨论】:

  • 这似乎是一个可靠的解决方案,因为它通过其所有容器从元素遍历 DOM,即使相关元素的高度为零,只要某些容器具有高度,它也应该工作.任何想法解释为什么它被否决?
  • 感谢您的回答,我已经用工作代码更新了我的问题。任何想法为什么 MSIE 失败?
  • 我会尝试在 window.load 事件中调用 findTop,并可能在单独的按钮调用中查看它是否提供不同的信息。我之前听说过,如果 IE 仍在加载 dom,它可能会为偏移属性提供不正确的信息。另一件要尝试的事情是为“fb-root” div 设置 position:relative ,看看这是否会给你一个不同的答案。如果这样做,还要检查 html 元素的边距和内边距。
【解决方案3】:

如果document.getElementById("fb-root").clientHeight 返回 0,那肯定意味着您的“fb-root”div 要么没有显示,要么仍然为空。

我看过 fapi.js,似乎调用 FAPI.init 函数会创建一个 id 为“FAPI_Flash_wrap”的跨度,将其附加到文档的正文中,然后嵌入一个带有 id 的 Flash 对象“ FAPI_Flash”在这个范围内。

所以我会尝试检索 id 为“FAPI_Flash_wrap”或“FAPI_Flash”而不是“fb-root”的元素:

<script type="text/javascript">
FAPI.init("http://api.odnoklassniki.ru/", "XXX_YYY",
function() {
    alert("Height = " + document.getElementById("FAPI_Flash_wrap").offsetHeight);
    alert("Width = " + document.getElementById("FAPI_Flash_wrap").offsetWidth);
    FAPI.UI.setWindowSize(720, 1200);
}, function(error){alert("API initialization failed");}
);
</script>
我希望这行得通!

如果是这样的话,那就用

<script type="text/javascript">
FAPI.init("http://api.odnoklassniki.ru/", "XXX_YYY",
function() {
    var height = document.getElementById("FAPI_Flash_wrap").offsetHeight;
    var width = document.getElementById("FAPI_Flash_wrap").offsetWidth;
    FAPI.UI.setWindowSize(width, height);
}, function(error){alert("API initialization failed");}
);
</script>

【讨论】:

  • 很抱歉,警报根本没有出现,页面也没有调整大小。在 Firebug 控制台中,我看到许多警告,但没有相关错误。当我用硬编码的高度放回原始代码时 - 它突然可以正常工作了。
  • 嗯,奇怪。如果你尝试“alert(document.getElementById(someID));”在 Firebug 命令行中,它必然会弹出“[object someInterfaceName]”或“null”,因此您可以检查此时是否存在 id 为“someID”的元素。如果“FAPI_Flash_wrap”和“FAPI_Flash”都不存在,可能游戏加载成功后页面的完整HTML会有用。
【解决方案4】:

使用 offsetHeightclientHeight 获取 div 的高度:

document.getElementById("fb-root").offsetHeight // including border
document.getElementById("fb-root").clientHeight // excluding border 

使用 offsetLeftoffsetTop 获取 div 相对于其 offsetParent 的位置。 offsetParent 是它的第一个父框,位置样式是固定的、相对的或绝对的。

【讨论】:

  • 谢谢,但 getElementById() 是否适用于所有主流浏览器?
  • 是的。几乎所有浏览器都支持 getElementByIdsee this link
  • 不幸的是,由于某种原因,offsetHeight 和 clientHeight 都打印为 0 - 请参阅我更新的问题
  • 你能把#fb-root的内容完整粘贴吗?或者给我你的测试页面的链接,我可以访问。
  • 地址是odnoklassniki.ru/game/preferans(对不起,它是在俄罗斯的Facebook克隆)。当我 alert("XXX" + document.getElementById("fb-root").clientHeight);它打印“XXX 0”。
    为空。上面是我的Flash游戏。我使用了一个空的 div,因为这通常是为真正的 Facebook 完成的:stackoverflow.com/questions/5928724/…
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多