【问题标题】:JQuery - Callback for offset()/position()JQuery - 回调偏移()/位置()
【发布时间】:2013-05-16 23:15:04
【问题描述】:

我有一个 div 包含一个列表元素,这些元素具有静态定位以及我想要的每个元素

  1. 使用offset()方法记录其绝对定位
  2. 将其位置更改为absolute,将其移至其他位置,然后使用记录的坐标将其移回其原始位置

首先我尝试了这个:

var positions = {};
myDiv.children().each(function(){
    var child = $(this);
    var id = child.attr('id');
    var offset = child.offset();
    positions[id] = [offset.left, offset.top];

    child .css('position', 'absolute');
    var x = ...;
    var y = ...;
    child.css('left', x);
    child.css('top', y);
});

console.log(positions);

在这种情况下,“位置”对象的每个条目都具有相同的坐标(第一个元素的值)。但是,如果我注释掉移动元素的位,positions 对象对于每个子对象都有正确的坐标。

所以我猜这是一个同步问题,因为在 offset 函数终止之前调用了 css 函数。

所以我真正需要的是确保块 child.css('left', x); child.css('top', y); 仅在“偏移”功能完成时执行。

我尝试过类似

$.queue(child, 'foo', function() {
        var offset = $(this).offset();
        positions[id] = [offset.left, offset.top];
        jQuery.dequeue(this);
    });
$.dequeue(child, 'foo');
child.promise().done(function() {
        child.css('position', 'absolute');
        ...
    });

但没有运气:当我记录 positions 对象时,它的坐标仍然错误。

我对 JS 和 JQuery 还很陌生,所以我知道如何在这里做正确的事情。

我如何确保块 child.css('left', x); child.css('top', y); 仅在“位置”对象填充了正确的偏移坐标后才会执行?

编辑 我刚刚意识到,在我的情况下,我需要使用 'position()' 而不是 'offset()' 但这并没有真正改变我所描述的问题

【问题讨论】:

    标签: javascript jquery css xhtml promise


    【解决方案1】:

    在.each() 中更改同级元素的位置可能会导致在第一个之后得到错误的坐标。

    为什么不在更改之前获取并存储所有位置? 我的意思是你应该迭代孩子的两倍。

    1. 迭代children并存储位置,不要改变任何css,
    2. 再次迭代 children 并更改 css。

    【讨论】:

    • 作为一个黑客,我也在使用计时器,但想知道是否有更清洁的东西。在您的简单示例中,您只有一个在我的情况下也适用的元素:第一个孩子正确存储了他的坐标,但其他所有都没有。他们实际上得到了和第一个人一样的价值观
    • 在.each() 中更改同级元素的位置可能会导致在第一个之后得到错误的坐标。为什么不在更改之前获取并存储所有位置?我的意思是你应该迭代孩子的两倍。 1-迭代孩子并存储位置,不要更改任何css,2-再次迭代孩子并更改css。
    • 这是一个很好的观点,它解释了一切!这根本不是同步问题,确实一切正常。我试过你的建议,效果很好。请张贴并回答,我会接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多