2012-04-19 89 views
6

我有一個模式窗口。我想要做的是在模式打開時從頁面中刪除某些元素,並在模式關閉後將它們添加回原來的位置。我不想顯示:無,因爲只隱藏它們,我需要它們實際上從頁面中刪除。所以我有一個jQuery刪除,並將其添加回來後,一個計時器只是爲了測試...從DOM中刪除元素並將其添加回他們所在的位置

更新:隨着這些代碼的增加,它現在抓取元素之前,然後將其添加回相同的元素。問題是,如果該元素也被刪除,該怎麼辦?然後它不會重新加入!此外,不會在這個JavaScript事件處理程序丟失?我開發了一個插件,所以它應該儘可能少地干擾網站,但是3D元素在Safari中存在一個無法繞開的bug。

任何想法如何我可以暫時刪除3D元素,而不會干擾人們的網站太多?

$3delements = $('*').filter(function(){return $(this).css('-webkit-transform-style') == 'preserve-3d'}); 
$3delementsposition = $3delements.prev() 

//On modal open 
$3delements.remove(); 

//On modal close 
$3delementsposition.after($3delements); 

的問題是,這需要我在DOM他們回來在指定某一個地方,我想元素回來在原來的位置。我如何確保這些元素不會改變/移動/丟失.append上的.remove信息。

+0

指定「位置「 在這種情況下。它的容器內容中的元素的順序是什麼?他們是深度還是兄弟姐妹?你有軸承,我們可以錨定一個查詢,所以我們可以相對位置? – Joseph 2012-04-19 05:31:32

+0

我已經對代碼做了一些更改,看看他們是否回答你的問題... – alt 2012-04-19 05:41:27

+0

儘管jQuery中有可能獲取DOM中元素的深度和位置,但我認爲無法獲得確切的位置它的兄弟姐妹中的元素。考慮一下:如果我們預先/附加/刪除了兄弟姐妹或者更糟糕的話,那麼通常替換內容,那麼實際位置現在已經消失了。 – Joseph 2012-04-19 05:47:15

回答

8
  1. 使用.detach().append()刪除並重新安裝的元素,它會維護所有事件和數據。

  2. 如果以相反的順序,您刪除它們添加元素回來,他們都應該到位回落


未經測試的代碼


var elems3d = $(...); 
var elemsRemoved = []; 

// removing 
elems3d.each(function(i,o) { 
    var elem = $(o); 
    elemsRemoved.push({ 
     loc: elem.prev(), 
     obj: elem.detach() 
    }); 
}); 

// adding back 
while (elemsRemoved.length) { 
    var elem = elemsRemoved.pop(); 
    elem.loc.after(elem.obj); 
} 
5

而不是刪除元素,用佔位符元素替換它們(使用replaceWith),然後在需要時用原始內容替換佔位符。像下面這樣:

$3delements = $('*').filter(function(){return $(this).css('-webkit-transform-style') == 'preserve-3d'}); 
var originals = []; 
$3delements.each(function() { 
    // Clone original, keeping event handlers and any children elements 
    originals.push($(this).clone(true)); 
    // Create placeholder for original content 
    $(this).replaceWith('<div id="original_' + originals.length + '"></div>'); 
}); 

/// 
/// Do something asynchronous 
/// 

// Replace placeholders with original content 
for (var i in originals) { 
$('#original_' + (i + 1)).replaceWith(originals[i]); 
} 

更多信息,請參見clonereplaceWith在jQuery的文檔。

-4

我已經創建了小提琴。讓我知道這是否滿足您的要求。

http://jsfiddle.net/mNsfL/12/

+1

請在回答中加入相關代碼,而不是隻發佈鏈接! – ThiefMaster 2012-04-19 06:26:09

+3

要求-1的好方法。誰知道未來小提琴是否仍然在線?小提琴非常適合演示代碼,但回答問題的代碼仍應包含在答案中。 – ThiefMaster 2012-04-19 14:49:43

相關問題