Javascript JQuery-offset()/position()的回调

Javascript JQuery-offset()/position()的回调,javascript,jquery,css,xhtml,promise,Javascript,Jquery,Css,Xhtml,Promise,我有一个div,其中包含一个列表元素,该列表元素具有静态定位,并且对于我想要的每个元素 使用offset()方法记录其绝对位置 将其定位更改为“绝对”,将其移动到其他位置,然后使用记录的坐标将其移回原始位置 首先,我尝试了这个: var positions = {}; myDiv.children().each(function(){ var child = $(this); var id = child.attr('id'); var offset = child.of

我有一个
div
,其中包含一个列表元素,该列表元素具有静态定位,并且对于我想要的每个元素

  • 使用
    offset()
    方法记录其绝对位置
  • 将其定位更改为“绝对”,将其移动到其他位置,然后使用记录的坐标将其移回原始位置
  • 首先,我尝试了这个:

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

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

    所以我真正需要的是确保块
    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');
            ...
        });
    
    但是没有运气:当我记录
    位置
    对象时,它仍然有错误的坐标

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

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

    编辑 我刚刚意识到,在我的例子中,我需要使用“position()”而不是“offset()”,但这并不能真正改变我在
    中描述的问题。每个()
    更改兄弟元素的位置可能会导致在第一个元素之后获得错误的坐标

    为什么不在更换前获取并存储所有位置? 我的意思是,你应该重复儿童的两次

  • 迭代儿童和存储位置,不更改任何css
  • 再次迭代子对象并更改css

  • 作为一名黑客,我也在使用计时器,但我想知道是否有更干净的东西。在您的简单示例中,只有一个元素在我的示例中也有效:第一个孩子正确地存储了坐标,但其他所有孩子都没有。实际上,它们在
    中获得的值与第一个guy相同。每个()
    更改同级元素的位置可能会导致在第一个元素之后获得错误的坐标。为什么不在更换前获取并存储所有位置?我的意思是,你应该重复儿童的两次。1-迭代儿童和存储位置,不更改任何css,2-再次迭代儿童并更改css。这是一个很好的观点,它解释了一切!这根本不是一个同步问题,一切都很好。我试过你的建议,效果很好。请张贴和回答,我会接受它。