2010-06-21 77 views
131

比方說,我定義元素如何檢查jQuery元素是否在DOM中?

$foo = $('#foo'); 

,然後我打電話

$foo.remove() 

一些事件。我的問題是,如何檢查$ foo是否已從DOM中刪除?我發現$foo.is(':hidden')作品,但這當然也返回true,如果我只是叫$foo.hide()

回答

215

像這樣:

if (!jQuery.contains(document, $foo[0])) { 
    //Element is detached 
} 

如果該元素的父母之一是刪除(在這種情況下,元素本身仍然有一個父)這仍然可以工作。

+0

+1這就是光滑:) – 2012-08-09 13:13:53

+12

做'$ foo.closest(document.documentElement)'更快(如果有人在乎http://jsperf.com/jquery-element-in-dom) – urraka 2013-02-02 14:03:23

+47

@PerroAzul:我發現了一個_much_更快的替代方法:http://jsperf.com/jquery-element-in-dom/2 – SLaks 2013-02-03 00:12:22

4

我才意識到,我打字我的問題的答案:呼叫

$foo.parent() 

如果$f00已從DOM刪除,那麼$foo.parent().length === 0。否則,它的長度將是至少爲1。

[編輯:這是不完全正確的,因爲去除元件仍然可以有一個父;舉例來說,如果你刪除一個<ul>,它的每個子<li> S的仍將有一個父。改用SLaks的答案。

+1

...除非刪除節點不是唯一的孩子 – 2010-06-21 15:41:51

+0

@阿爾瓦羅 - 爲什麼會是怎麼回事? – user113716 2010-06-21 16:04:23

+0

@帕特里克:我錯過了什麼?如果$ foo.parent()。length長度大於零,你能保證什麼? – 2010-06-21 16:22:57

21

如何這樣做:

$element.parents('html').length > 0 
+0

我認爲這是更快 – 2014-07-17 02:21:31

+13

其實它是最慢的一個:http://jsperf.com/jquery-element-in-dom/60 – suda 2015-01-12 19:35:25

0

同意佩羅的評論。它也可以這樣做:

$foo.parents().last().is(document.documentElement); 
4

由於我無法作爲評論作出迴應(我猜測業績太低),這裏是一個完整的答覆。最快的方法是輕鬆展開jQuery檢查以支持瀏覽器,並將常量因素降至最低。

還可以看出在這裏 - 的代碼是這樣的 - http://jsperf.com/jquery-element-in-dom/28

var isElementInDOM = (function($) { 
    var docElt = document.documentElement, find, 
     contains = docElt.contains ? 
     function(elt) { return docElt.contains(elt); } : 

     docElt.compareDocumentPosition ? 
      function(elt) { 
      return docElt.compareDocumentPosition(elt) & 16; 
      } : 
      ((find = function(elt) { 
       return elt && (elt == docElt || find(elt.parentNode)); 
      }), function(elt) { return find(elt); }); 

    return function(elt) { 
    return !!(elt && ((elt = elt.parent) == docElt || contains(elt))); 
    }; 
})(jQuery); 

這是語義上等同於jQuery.contains(document.documentElement中,ELT [0])。

0

爲什麼不乾脆:if($('#foo').length === 0)...

+0

@stevematdavies問題是「如何測試給定的jQuery對象中的元素在DOM中「,而不是」如何測試與給定選擇器字符串匹配的元素是否在DOM中「。 – 2015-06-18 21:27:38

+0

@TrevorBurnham:平心而論,使用用於創建'$ foo'的選擇器重新查詢,並檢查重新查詢是否匹配任何元素,似乎是許多情況下可行的解決方案。由於jQuery和瀏覽器如何優化某些選擇器(比如通過ID),它甚至可能比其他解決方案的*更快。 – Matt 2015-06-18 21:42:41

+0

@Matt $ foo可能是從DOM中分離的內存中的一個元素,並且可能會有一個元素與DOM中的匹配選擇器。尋找這個問題的答案的人可能想要檢查它是否在DOM中。有人在這樣的東西中工作,顯然知道如何查詢DOM。 – 2017-03-03 17:07:54

0
if($foo.nodeType){ element is node type} 
0
jQuery.fn.isInDOM = function() { 
    if (this.length == 1) { 
     var element = this.get(0); 
     var rect = element.getBoundingClientRect(); 
     if (rect.top + rect.bottom + rect.width + rect.height + rect.left + rect.right == 0) 
     return false; 
     return true; 
    } 
    return false; 
}; 
0

我很喜歡這種方法。沒有jQuery和沒有DOM搜索。首先找到最高的父母(祖先)。然後看看這是否是documentElement。

function ancestor(HTMLobj){ 
    while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement} 
    return HTMLobj; 
} 
function inTheDOM(obj){ 
    return ancestor(obj)===document.documentElement; 
} 
0

可能是最表演方式是:

document.contains(node); // boolean 

這也適用於使用jQuery:

document.contains($element[0]); // var $element = $("#some-element") 
document.contains(this[0]); // in contexts like $.each(), `this` is the jQ object 

來源從MDN

注:

+0

有人看過這個答案嗎?很好的回答+1(我收到了一個版本,謝謝) – 2017-10-22 23:24:07

相關問題