比方說,我定義元素如何檢查jQuery元素是否在DOM中?
$foo = $('#foo');
,然後我打電話
$foo.remove()
一些事件。我的問題是,如何檢查$ foo是否已從DOM中刪除?我發現$foo.is(':hidden')
作品,但這當然也返回true,如果我只是叫$foo.hide()
。
比方說,我定義元素如何檢查jQuery元素是否在DOM中?
$foo = $('#foo');
,然後我打電話
$foo.remove()
一些事件。我的問題是,如何檢查$ foo是否已從DOM中刪除?我發現$foo.is(':hidden')
作品,但這當然也返回true,如果我只是叫$foo.hide()
。
像這樣:
if (!jQuery.contains(document, $foo[0])) {
//Element is detached
}
如果該元素的父母之一是刪除(在這種情況下,元素本身仍然有一個父)這仍然可以工作。
我才意識到,我打字我的問題的答案:呼叫
$foo.parent()
如果$f00
已從DOM刪除,那麼$foo.parent().length === 0
。否則,它的長度將是至少爲1。
[編輯:這是不完全正確的,因爲去除元件仍然可以有一個父;舉例來說,如果你刪除一個<ul>
,它的每個子<li>
S的仍將有一個父。改用SLaks的答案。
...除非刪除節點不是唯一的孩子 – 2010-06-21 15:41:51
@阿爾瓦羅 - 爲什麼會是怎麼回事? – user113716 2010-06-21 16:04:23
@帕特里克:我錯過了什麼?如果$ foo.parent()。length長度大於零,你能保證什麼? – 2010-06-21 16:22:57
如何這樣做:
$element.parents('html').length > 0
我認爲這是更快 – 2014-07-17 02:21:31
其實它是最慢的一個:http://jsperf.com/jquery-element-in-dom/60 – suda 2015-01-12 19:35:25
同意佩羅的評論。它也可以這樣做:
$foo.parents().last().is(document.documentElement);
由於我無法作爲評論作出迴應(我猜測業績太低),這裏是一個完整的答覆。最快的方法是輕鬆展開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])。
爲什麼不乾脆:if($('#foo').length === 0)...
?
@stevematdavies問題是「如何測試給定的jQuery對象中的元素在DOM中「,而不是」如何測試與給定選擇器字符串匹配的元素是否在DOM中「。 – 2015-06-18 21:27:38
@TrevorBurnham:平心而論,使用用於創建'$ foo'的選擇器重新查詢,並檢查重新查詢是否匹配任何元素,似乎是許多情況下可行的解決方案。由於jQuery和瀏覽器如何優化某些選擇器(比如通過ID),它甚至可能比其他解決方案的*更快。 – Matt 2015-06-18 21:42:41
@Matt $ foo可能是從DOM中分離的內存中的一個元素,並且可能會有一個元素與DOM中的匹配選擇器。尋找這個問題的答案的人可能想要檢查它是否在DOM中。有人在這樣的東西中工作,顯然知道如何查詢DOM。 – 2017-03-03 17:07:54
if($foo.nodeType){ element is node type}
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;
};
我很喜歡這種方法。沒有jQuery和沒有DOM搜索。首先找到最高的父母(祖先)。然後看看這是否是documentElement。
function ancestor(HTMLobj){
while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement}
return HTMLobj;
}
function inTheDOM(obj){
return ancestor(obj)===document.documentElement;
}
可能是最表演方式是:
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
注:
有人看過這個答案嗎?很好的回答+1(我收到了一個版本,謝謝) – 2017-10-22 23:24:07
+1這就是光滑:) – 2012-08-09 13:13:53
做'$ foo.closest(document.documentElement)'更快(如果有人在乎http://jsperf.com/jquery-element-in-dom) – urraka 2013-02-02 14:03:23
@PerroAzul:我發現了一個_much_更快的替代方法:http://jsperf.com/jquery-element-in-dom/2 – SLaks 2013-02-03 00:12:22