2013-05-16 93 views
1

我有一個包含一個列表元素,其具有靜態定位和每個元件欲JQuery的 - 回調爲偏移()/位置()

  1. 記錄其絕對定位使用offset()方法
  2. 一個 div
  3. 其定位更改爲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);只會在'位置'對象填充正確的偏移座標後執行?

編輯 我才意識到,在我來說,我需要使用「位置()」而不是「偏移()」,但並沒有真正改變我所描述

回答

3

.each()問題改變兄弟元素的位置可能是導致第一個錯誤座標錯誤的原因。

爲什麼不在更改之前獲取並存儲所有職位? 我的意思是你應該迭代兒童雙倍。

  1. 迭代兒童和存儲位置,不改變任何CSS,再次
  2. 迭代兒童和改變CSS。
+0

作爲一個黑客我也使用計時器,但想知道是否有更清潔的東西。在你的簡單例子中,你只有一個元素也適用於我的情況:第一個孩子的座標存儲正確,但其他所有元素都沒有。他們實際上獲得了與第一個人相同的值 – phoenix7360

+0

在'.each()中,改變同胞元素的位置可能會導致第一個座標錯誤。爲什麼不在更改之前獲得並存儲所有職位?我的意思是你應該迭代兒童雙倍。 1-迭代兒童和商店的位置,不要更改任何CSS,2-再次迭代兒童,並更改CSS。 – ocanal

+0

這是一個很好的觀點,它解釋了一切!這根本不是一個同步問題,確實一切正常。我嘗試了你的建議,它完美地工作。請張貼和答覆,我會接受它。 – phoenix7360