Chrome的jQuery位置问题

Posted

技术标签:

【中文标题】Chrome的jQuery位置问题【英文标题】:jQuery position problem with Chrome 【发布时间】:2010-01-31 19:40:31 【问题描述】:

当我提醒值 .position().left 时,它在 Chrome 上返回 0。对于其他浏览器,它会返回实际数字。为什么会这样?

【问题讨论】:

请发布更多代码,特别是您在哪个元素上调用position,也许还有一些 html/CSS 看看可能出了什么问题。 【参考方案1】:

基于 Webkit 的浏览器(如 Chrome 和 Safari)只有在图像完全加载后才能访问图像 widthheight 属性。其他浏览器只要加载 DOM 就可以访问这些信息(它们不需要完全加载图像来知道它们的大小)。

因此,如果您的页面中有图像,则使用基于 Webkit 的浏览器您应该在 $(window).load 事件触发后访问 offset 信息,而不是在 $(document).ready 事件后访问。

【讨论】:

有时即使这样也行不通。另一种选择是在您的 css 中手动设置图像大小。 显然 webkit 也只能在 window.load 之后访问文本宽度和高度属性。似乎很愚蠢,即使 Internet Explorer 也能做到这一点。我认为最后一个会出错的是 webkit。【参考方案2】:

通过从http://api.jquery.com/position/ 读取 cmets,有几种方法可以解决此问题。 我发现工作的是

Ajaho [版主]:此插件功能修复问题 在 Chrome 中的位置错误

jQuery.fn.aPosition = function() 
    thisLeft = this.offset().left;
    thisTop = this.offset().top;
    thisParent = this.parent();

    parentLeft = thisParent.offset().left;
    parentTop = thisParent.offset().top;

    return 
        left: thisLeft-parentLeft,
        top: thisTop-parentTop
    ;
;

【讨论】:

【参考方案3】:

Webkit 有时可能太快了,但它通常在 jQuery 中得到处理。您可以使用以下方式进行调试:

var v, elem = $('.myElement');
window.setTimeout(function() 
    v = elem.position().left;
    console.log(v);
    if (v) 
        return false;
    
    window.setTimeout(arguments.callee, 1);
, 1);

这将检查职位是否以及何时可用。如果您在无穷大中记录“0”,则position().left“从不”可用,您需要在其他地方进行调试。

【讨论】:

谢谢 - 这也是 jQuery.offset() 返回不正确(非零)值的原因 - 看起来我的 CSS 定位导致 Chrome 将文档布局两次(或其他内容)。过早调用 offset 会返回元素的位置,就像没有 CSS 时一样。 +1 我昨天遇到了这个问题。即使在简单的$(function()console.log($('img').position().top);); 中位置也不正确,但稍后在单击事件中使用相同的代码时位置是正确的。【参考方案4】:

我有同样的问题..

我改用:.offset().left 修复它。但请注意,它们不一样: http://api.jquery.com/offset/

.position().left 在我做的一些测试中在 Chrome 中工作,使用 与 David 类似的方法(该值自 第一次尝试)。

在我的“真实”应用程序中甚至失败了 读取点击事件的位置(这可能会消除任何加载 速度问题)。 一些 cmets(在其他论坛中)说这可能是相关的 使用display:inline-block。然而我做不到 使用inline-block 重现问题。所以它可能 成为其他东西。

【讨论】:

【参考方案5】:

可能有点过时了,因为问题可以追溯到 2010 年,但这解决了我在 Chrome 中的定位问题:

$(window).load(function()
  p = $('element').offset();
  // et cetera
);

【讨论】:

【参考方案6】:

使用 jQuery(window).load() 代替 jQuery(document).ready()

【讨论】:

【参考方案7】:

对我来说,它是通过将 javascript 代码放在正文标记关闭之前准备好的文档中来工作的

这样它会在加载完所有内容后执行代码

    <body>
        <div>content</div>
        <div class='footer'>footer</div>
        .
        .
        .

        <script type='text/javascript>
            $(document).ready(function()
              var footer_position = $(".footer").offset().top;
              console.log(footer_position);
            );
        </script>
     </body>

【讨论】:

【参考方案8】:

我用这个函数来修正它。

function getElementPosition(id) 
          var offsetTrail = document.getElementById(id);
          var offsetBottom = 0;
          var offsetTop = 0;
          while (offsetTrail) 
              offsetBottom += offsetTrail.offsetBottom;
              offsetTop += offsetTrail.offsetTop;
              offsetTrail = offsetTrail.offsetParent;
          

          return 
              bottom: offsetBottom,
              toppos: offsetTop
          ;
      

【讨论】:

以上是关于Chrome的jQuery位置问题的主要内容,如果未能解决你的问题,请参考以下文章

JQuery 动画在 Chrome 中触发较晚

jQuery animate() 在 Google Chrome 和 Safari 中的左侧位置

jquery 虚拟键盘 - Chrome 和 Edge 中的光标不闪烁

jQuery `[jQuery created Element].is(":hover")` 似乎只在 Chrome 中工作

如何使用固定位置的jQuery可拖动?

fadeTo 与 Jquery 在 Retina Macbook Pro 上的 Chrome 中不起作用