我有一個包含一個列表元素,其具有靜態定位和每個元件欲JQuery的 - 回調爲偏移()/位置()
- 記錄其絕對定位使用
offset()
方法 一個
- 其定位更改爲
absolute
,別的地方移動它,然後再使用所記錄的座標
div
首先我想這其移回原來的位置:
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);
只會在'位置'對象填充正確的偏移座標後執行?
編輯 我才意識到,在我來說,我需要使用「位置()」而不是「偏移()」,但並沒有真正改變我所描述
作爲一個黑客我也使用計時器,但想知道是否有更清潔的東西。在你的簡單例子中,你只有一個元素也適用於我的情況:第一個孩子的座標存儲正確,但其他所有元素都沒有。他們實際上獲得了與第一個人相同的值 – phoenix7360
在'.each()中,改變同胞元素的位置可能會導致第一個座標錯誤。爲什麼不在更改之前獲得並存儲所有職位?我的意思是你應該迭代兒童雙倍。 1-迭代兒童和商店的位置,不要更改任何CSS,2-再次迭代兒童,並更改CSS。 – ocanal
這是一個很好的觀點,它解釋了一切!這根本不是一個同步問題,確實一切正常。我嘗試了你的建議,它完美地工作。請張貼和答覆,我會接受它。 – phoenix7360