Answers:
像这样:
if (!jQuery.contains(document, $foo[0])) {
//Element is detached
}
如果元素的父元素之一被删除(在这种情况下,元素本身仍将具有父元素),则此方法仍然有效。
$.contains(document.documentElement, $foo.get(0))是最快的方法。
document.contains($foo[0])
在输入问题时,我刚刚意识到一个答案:打电话
$foo.parent()
如果$f00已从DOM中删除,则$foo.parent().length === 0。否则,其长度将至少为1。
[编辑:这并不完全正确,因为删除的元素仍然可以具有父元素;例如,如果您删除,则<ul>其每个子级<li>仍将有一个父级。请改用SLaks的答案。
$foo已从DOM中删除。如果成功删除,它将不再具有父元素。因此$foo.parent().length === 0意味着清除成功。
由于我无法以评论的形式回应(我认为业报太低),因此,这里是完整的答复。最快的方法是轻松展开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])。
可能最有效的方式是:
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
注意:
而不是迭代父母,您只需获取元素dom与dom分离时的边界rect即可为全零。
function isInDOM(element) {
var rect=element.getBoundingClientRect();
return (rect.top || rect.bottom || rect.height || rect.width)?true:false;
}
如果要处理宽度零高度元素为零且顶部零,元素零为零的边缘情况,则可以通过迭代父级直到document.body来进行仔细检查。
display: none也没有boundingRect 的元素
同意佩罗的评论。也可以这样完成:
$foo.parents().last().is(document.documentElement);
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;
};
为什么不只是: if( $('#foo').length === 0)...?
$foo在许多情况下,使用用于创建的选择器进行重新查询,并检查重新查询是否匹配任何元素,似乎是解决该问题的可行解决方案。由于jQuery和浏览器如何优化某些选择器(例如按ID),因此它甚至可能比其他解决方案更快。
$foo.closest(document.documentElement)的速度更快(如果有人关心jsperf.com/jquery-element-in-dom)