2014-01-12 75 views
0

我想構建一個腳本,它將刪除DOM元素並將它們添加回原來的位置。我做了一些研究,發現了一個看起來應該起作用的代碼片段。我遇到的唯一問題是全局變量LOelemsRemovedLIelemsRemoved不保留它們在匿名函數中獲得的值。代碼如下:jQuery匿名函數不能使用全局變量

var LOelemsRemoved = []; 
var LIelemsRemoved = []; 

function switchContent() { 
    if (loggedIn()) { 
     $(".logged-out").each(function (i, o) { 
      elem = $(o); 
      window.LOelemsRemoved.push({ 
       loc: elem.prev(), 
       obj: elem.detach() 
      }); 
      alert(LOelemsRemoved.length); //returns the correct values for each iteration 
      alert('removed LO elems'); 
      window.LOelemsRemoved = LOelemsRemoved; 
     }); 
     alert(LIelemsRemoved.length); //outputs 0 
     while (LIelemsRemoved.length) { 
      elem = elemsRemoved.pop(); 
      elem.loc.after(elem.obj); 
      alert("added LI elems"); 
     } 
    } else { 
     $(".logged-in").each(function (i, o) { 
      elem = $(o); 
      window.LIelemsRemoved.push({ 
       loc: elem.prev(), 
       obj: elem.detach() 
      }); 
      alert(LIelemsRemoved.length); //returns the correct values for each iteration 
      alert('removed li elems'); 
      window.LIelemsRemoved = LIelemsRemoved; 
     }); 
     alert(LOelemsRemoved.length); //outputs 0 
     while (LOelemsRemoved.length) { 
      elem = elemsRemoved.pop(); 
      elem.loc.after(elem.obj); 
      alert('added LOEleems'); 
     } 
    } 
} 

如您所見,兩個變量都在switchContent()之外聲明。 4條註釋行顯示哪些alert語句返回哪些值。 .each語句中的那些返回它們應該的值。但是,一旦.each聲明結束執行,LOelemsRemovedLIelemsRemoved都具有長度0。我猜這是一個範圍問題,因爲我使用的是匿名函數,但是我並沒有使用JavaScript進行非常高級的處理,所以我不確定範圍問題是什麼。謝謝!

+0

嘗試使用變量名稱不'window.',它會使用最近的一個。爲什麼'elem'沒有被宣佈,是全球性的? – elclanrs

+0

在'if'塊中,您將項目添加到'LOelemsRemoved',而不是'LIelemsRemoved',所以當然'LIelemsRemoved.length'將會是'0'。在'else'塊中反過來也是如此。你還期望什麼? –

+0

對不起,我想我錯誤地傳達了我的想法。基本上,這是爲了切換可見內容而不用重新加載頁面,一旦用戶登錄到網站。發生這種情況時,應該刪除登出課程的任何內容,並且應該添加登錄課程的任何內容。當他們註銷時反之亦然。我打印LIelemsDeleted的原因是因爲這就是需要重新添加的內容。我明白你的意思。所以也許我想要做的是另一種解決方案?唯一的是我必須刪除DOM元素,因爲一些CSS樣式。 – Globmont

回答

0

也許你的變量定義是在另一個函數內部的,在這種情況下,它們將在本地範圍內。爲了確保這種情況不會發生,而不是這樣的:

var LOelemsRemoved = []; 
var LIelemsRemoved = []; 

做到這一點:

window.LOelemsRemoved = []; 
window.LIelemsRemoved = []; 
+0

我給了這個鏡頭,但它沒有什麼區別:(閱讀@FelixKling的回覆後,我認爲這可能是一個結構性問題,而不是程序錯誤。我認爲我試圖使用的解決方案贏得' t爲我的目的工作。我已經回覆了Felix對我正在尋找什麼的評論。 – Globmont

0

我決定用一個類似但略有不同的方法也做到這一點。一旦頁面加載,運行此:

window.$loggedInElements = $(".logged-in"); 
window.$loggedOutElements = $(".logged-out"); 
$loggedInElements.each(function(i,o) { 
     var currElem = $(o); 
     currElem.data("prev",currElem.prev()); 
    }); 

    $loggedOutElements.each(function(i,o) { 
     var currElem = $(o); 
     currElem.data("prev",currElem.prev()); 
    }); 

然後,在我的switchContent()功能,我有這樣的代碼:

function switchContent() { 
    if(loggedIn()) 
    { 

     $loggedInElements.each(function(i,o) { 
      var currElem = $(o); 
      currElem.addClass("logged-in"); 
      currElem.insertAfter(currElem.data("prev")); 
     }); 
     $loggedOutElements.each(function(i,o) { 
      //alert($(o).attr("id")); 
      $(o).removeClass("logged-out"); 
      $(o).detach(); 
     }); 
    } 
    else 
    { 

     $loggedOutElements.each(function(i,o) { 
      var currElem = $(o); 
      currElem.addClass("logged-out"); 
      currElem.insertAfter(currElem.data("prev")); 
     }); 
     $loggedInElements.each(function(i,o) { 
      //alert($(o).attr("id")); 
      $(o).removeClass("logged-in"); 
      $(o).detach(); 
     }); 
    } 
}