2011-03-21 97 views
0

這是處理 - 我有一個頁面上的元素負載,並且我正在使用Javascript來刪除它們中的一些(this.parentNode.removeChild(this))這是工作很好。但是,如果我有一個引用這個節點的變量,那麼刪除節點,該變量不會失去它的值!但是,如果我嘗試對此元素執行其他操作,則會出錯!檢查節點是否存在於Javascript

例子:

var element = document.getElementById('ooolookatmeimanelement'); 
element.parentNode.removeChild(element); 
alert(element); 

我仍然得到「[對象HTMLblahblahblah]」的警報,而不是null或undefined - 任何人有任何想法如何,我可以檢查,看看是否該節點已被刪除?這可能是一件非常簡單的事,我不知道!

回答

6

如果您刪除節點,請刪除引用。例如。在你的代碼,分配給nullelement

element = null; 

或者,如果這是不可能的,你可以隨時檢查parentNode值。它應該給null如果元素不是DOM的一部分:

if(element.parentNode === null) { 
    // element is not part of the DOM 
} 

但是,這並沒有多大意義,我(可能取決於上下文雖然):如果刪除一個元素,那麼你知道你已經刪除它。你爲什麼要對它進行進一步的操作?

+0

我不知道這是可能的代碼我使用 - 我給的例子是一個非常簡單的例子 - 我實際使用TinyMCE的,除去其中包含一個div一個tinyMCE的實例,然後使用for循環遍歷所有實例,當然這找到了一個不再存在的實例,但它不知道,所以它會向我拋出錯誤。 我會看看我是否可以調整我用來刪除對象的代碼,以阻止這種情況的發生:) – HughieW 2011-03-21 12:18:17

+0

使用你的代碼和我的頭(今天工作不多),我對它進行了排序:) - 如果(tinymce.editors [i] .container.parentNode.parentNode!== null){//對確實存在的元素進行操作} – HughieW 2011-03-21 12:26:43

+0

工程就像一個魅力。我不得不使用這個修補插件。該插件忘記刪除/檢查它以前刪除的HTML引用,所以一旦你嘗試使用插件之後,它會拋出大量錯誤。 – ShadowScripter 2013-04-10 14:25:52

0

.removeChild()只從DOM中刪除元素,而不是從內存中刪除元素。

因此,它仍然存在,直到它被垃圾收集。但是你持有一個參考,所以這不會發生。

0

可能節省如果你需要運行的JavaScript通過onClick它做一些事情本身引發的另一個時間點,你可以這樣做:

onClick="if(!document.getElementById(this.id))return false; YOUR CODE HERE" 

對於我來說,這次來到了,當我有一個DIV與幾個孩子,其中之一是「刪除這個div」按鈕(實際上DIV看起來像一個按鈕)。點擊後,該按鈕會按預期從DOM中刪除DIV,但會調用DIV本身的onClick事件(不再存在)。這造成了問題。通過將其添加到我的DIVonClick,我阻止了在刪除之後運行引用DIV的代碼。

0

您也可以使用document.body.contains(element);或$.contains(body, element)

檢查parentNode是不可靠的;如果刪除的內容是元素的祖先,而不是元素本身,那麼parentNode仍然會返回父元素,而元素不再在DOM中。

var ancestor = document.querySelector('div'); 
 
var ghost = document.querySelector('br'); 
 
ancestor.parentNode.removeChild(ancestor); 
 
console.log(ghost.id + ' son of ' + ghost.parentNode.id); 
 
console.log(ghost.id + (document.body.contains(ghost) || ' dont') + ' exists in DOM');
<div id="ancestorToRemove"> 
 
    <p id="a bitch"> 
 
     <br id="you"> 
 
    </p> 
 
</div>

相關問題