我想構建一個腳本,它將刪除DOM元素並將它們添加回原來的位置。我做了一些研究,發現了一個看起來應該起作用的代碼片段。我遇到的唯一問題是全局變量LOelemsRemoved
和LIelemsRemoved
不保留它們在匿名函數中獲得的值。代碼如下: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
聲明結束執行,LOelemsRemoved
和LIelemsRemoved
都具有長度0
。我猜這是一個範圍問題,因爲我使用的是匿名函數,但是我並沒有使用JavaScript進行非常高級的處理,所以我不確定範圍問題是什麼。謝謝!
嘗試使用變量名稱不'window.',它會使用最近的一個。爲什麼'elem'沒有被宣佈,是全球性的? – elclanrs
在'if'塊中,您將項目添加到'LOelemsRemoved',而不是'LIelemsRemoved',所以當然'LIelemsRemoved.length'將會是'0'。在'else'塊中反過來也是如此。你還期望什麼? –
對不起,我想我錯誤地傳達了我的想法。基本上,這是爲了切換可見內容而不用重新加載頁面,一旦用戶登錄到網站。發生這種情況時,應該刪除登出課程的任何內容,並且應該添加登錄課程的任何內容。當他們註銷時反之亦然。我打印LIelemsDeleted的原因是因爲這就是需要重新添加的內容。我明白你的意思。所以也許我想要做的是另一種解決方案?唯一的是我必須刪除DOM元素,因爲一些CSS樣式。 – Globmont