检查缓存的jquery对象是否仍在DOM中

Mic*_*ski 15 javascript jquery jquery-plugins

有谁知道如何判断缓存的jQuery对象是否已过时,例如不再在DOM中?例如:

var $cached_elem = $('.the_button');

// .. and then later

$cached_elem.text('updating...');
Run Code Online (Sandbox Code Playgroud)

我最近遇到了由于某些其他事件而从DOM中删除$ cached_elem的情况.那么我想做什么:

if ( $cache_elem.isStillInDOM() ){
  // now do time consuming stuff with $cached_elem in DOM 
}
Run Code Online (Sandbox Code Playgroud)

在任何人提供之前,我已经使用过这个,这对于我正在尝试做的事情来说是公平的模拟:

if ( $cached_elem.is(':visible') === true ){ ... }
Run Code Online (Sandbox Code Playgroud)

但是,这并不是一回事,在某些情况下可能会失败.

那么,任何人都可以想到一个简单的方法来直接检查缓存的jQuery对象是否"陈旧"?如果不是,我可能会被迫写一个插件......

Ste*_*rex 25

if($elem.closest('body').length > 0) 好像它可以做到这一点.

$(function() {
    var $button = $(".the_button");
    alert (isStale($button));
    $button.remove();
    alert (isStale($button));
});
    
function isStale($elem)
{
    return $elem.closest("body").length > 0;
};
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
    <span class="the_button">Hello World</span>
</div>
Run Code Online (Sandbox Code Playgroud)

编辑:更新以响应易江的评论,以便在删除其父元素时它将正确返回

编辑2:更新以响应lonesomeday的评论 - 更改parents()为'nearest()`以提高性能

  • 我觉得这种讽刺.缓存元素的方法是以后可以在不遍历DOM的情况下引用它.在这个答案中,你从缓存的元素开始,然后必须搜索DOM以找到'body',看看你缓存的元素是否仍然包含在'body'中.所以现在你有了额外的DOM遍历,这是因为你试图减少DOM遍历(缓存).下面的另一个答案更具讽刺意味....完全相同的DOM遍历已经缓存,完全否定了它首先被缓存的目的. (2认同)

Tho*_*ham 8

本机document.contains()方法应该比jQuery更快,以确定DOM中是否存在缓存的jQuery元素.

if (document.contains($cached_elem[0])) {
    // Element is still in the DOM
}
Run Code Online (Sandbox Code Playgroud)

  • 我对基准测试并确认了document.contains要快得多.$ elem.closest('body').length> 0大约需要1/81,000s,而document.contains()需要大约1/1,300,000s.因此,document.contains的速度提高了大约16倍.div_el = document.createElement('div'); document.contains(div_el); //返回false.好!document.body.appendChild(div_el); document.contains(div_el)//返回true.删除div并包含()再次报告false.这在附加和删除到头部时也有效,并且在现代浏览器中具有良好的支持.优秀! (2认同)