代码之家  ›  专栏  ›  技术社区  ›  Michael Mikowski

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

  •  13
  • Michael Mikowski  · 技术社区  · 15 年前

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

    var $cached_elem = $('.the_button');
    
    // .. and then later
    
    $cached_elem.text('updating...');
    

    我最近遇到了这样的情况:由于其他事件,$cached eu elem从DOM中删除。所以我想做的是:

    if ( $cache_elem.isStillInDOM() ){
      // now do time consuming stuff with $cached_elem in DOM 
    }
    

    在任何人提出建议之前,我已经采用了这一方法,这与我试图做的工作相当类似:

    if ( $cached_elem.is(':visible') === true ){ ... }
    

    然而,这并不是一回事,在某些情况下可能会失败。

    那么,是否有人能想出一种简单的方法来直接检查缓存的jquery对象是否“过时”?如果不是,我可能会被迫写一个插件…

    4 回复  |  直到 9 年前
        1
  •  23
  •   Lionel Paulus Steve Greatrex    9 年前

    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;
    };
    <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>

    编辑: 根据Yi Jiang的评论进行更新,以便在移除其父元素时正确返回

    编辑2: 根据Lonesomeday的评论更新-已更改 parents() “closest()”以提高性能

        2
  •  7
  •   Thomas Higginbotham    10 年前

    土生土长的 document.contains() 方法应该比jquery更快,以确定DOM中是否存在缓存的jquery元素。

    if (document.contains($cached_elem[0])) {
        // Element is still in the DOM
    }
    
        3
  •  0
  •   Jimmy Nitzan Tomer    15 年前

    如果选择器没有更改,只需重新初始化它:

    var $cached_elem = $('.the_button');
    // code that might remove some elements of $cached_elem
    $cached_elem = $('.the_button');
    

    如果要避免复制选择器字符串,请使用 selector 原始jquery对象的属性:

    var $cached_elem = $('.the_button');
    // code that might remove some elements of $cached_elem
    $cached_elem = $($cached_elem.selector);
    if ($cached_elem.length) {
      // element still exists
    }
    
        4
  •  0
  •   ryenus    10 年前

    在稍有变化的情况下,可以直接比较jquery对象包装的本机dom元素 $cached_elem .

    $cached_elem[0] === $($cached_elem.selector)[0]
    

    除了检查 $缓存 仍在dom中,这可以告诉您它是否仍然是原始的dom元素,而不是在某些/部分页面刷新后使用相同属性重新创建的元素。