2010-06-21 13 views
131

कहते हैं कि मैं एक तत्वमैं कैसे जांचूं कि एक jQuery तत्व डोम में है या नहीं?

$foo = $('#foo'); 

को परिभाषित करने और फिर मैं किसी घटना से

$foo.remove() 

कहते हैं। मेरा सवाल यह है कि, मैं कैसे जांच करूं कि डीओएम से $ foo हटा दिया गया है या नहीं? मैंने पाया है कि $foo.is(':hidden') काम करता है, लेकिन अगर मैं केवल $foo.hide() कहलाता हूं तो यह भी सच होगा। कॉल

$foo.parent() 

$f00 डोम से हटा दिया गया है, तो $foo.parent().length === 0:

उत्तर

215
इस तरह

:

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

यह अभी भी काम करेगा अगर तत्व के माता-पिता में से एक (इस स्थिति में तत्व में ही अभी भी एक माता पिता होगा) हटा दिया गया था।

+0

+1 कि चालाक :) –

+12

कर रहा है के लिए एक ठीक होगा '$ foo.closest (document.documentElement)' तेजी से होता है (किसी http://jsperf.com परवाह करता है अगर/jquery-element-in-dom) – urraka

+47

@PerroAzul: मुझे _much_ तेज विकल्प मिला: http://jsperf.com/jquery-element-in-dom/2 – SLaks

4

मैं सिर्फ एक जवाब के रूप में मैं अपने सवाल टाइप किया गया था एहसास हुआ। अन्यथा, इसकी लंबाई कम से कम 1.

[संपादित करें: यह पूरी तरह से सही नहीं है, क्योंकि हटाए गए तत्व में अभी भी माता-पिता हो सकते हैं; उदाहरण के लिए, यदि आप <ul> हटाते हैं, तो उसके प्रत्येक बच्चे <li> एस में अभी भी एक अभिभावक होगा। इसके बजाए स्लाक्स के उत्तर का प्रयोग करें।

+1

... जब तक हटाया नोड एक इकलौती संतान –

+0

@ अलवारो नहीं था - क्यों होगा उस बात के? – user113716

+0

@patrick: क्या मुझे कुछ याद आया? अगर आप $ foo.parent() लंबाई शून्य से अधिक है तो आप क्या आश्वस्त कर सकते हैं? –

21

यह कैसे करने के बारे में:

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

मुझे लगता है कि यह बहुत तेजी से –

+13

वास्तव में यह है सबसे धीमी एक: http://jsperf.com/jquery-element-in-dom/60 – suda

0

Perro की टिप्पणी के साथ सहमत हूँ। यह भी इस तरह किया जा सकता है:

$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, ईएलटी [0])।

0

क्यों नहीं: if($('#foo').length === 0)...?

+0

सवाल "कैसे परीक्षण करने के लिए है @stevematdavies हैं कि कोई jQuery वस्तु में एक तत्व डीओएम में है "नहीं," यह जांचने के लिए कि किसी दिए गए चयनकर्ता स्ट्रिंग से मेल खाने वाला तत्व डोम में है या नहीं। " –

+0

@TrevorBurnham: सभी निष्पक्षता में, चयनकर्ता का उपयोग करके फिर से पूछताछ जिसका उपयोग '$ foo' बनाने के लिए किया गया था, और जांच कर रहा है कि पुन: क्वेरी किसी भी तत्व से मेल खाती है, कई स्थितियों में समस्या का व्यवहार्य समाधान लगता है।यह कुछ अन्य समाधानों की तुलना में * तेज * भी हो सकता है क्योंकि jQuery और ब्राउज़र दोनों कुछ चयनकर्ताओं (जैसे आईडी द्वारा) को अनुकूलित करते हैं। – Matt

+0

@Matt $ foo डोम से अलग स्मृति में एक तत्व हो सकता है, और मुझे डोम में मिलानकर्ता चयनकर्ता के साथ एक तत्व हो सकता है। लोग इस प्रश्न का उत्तर ढूंढ रहे हैं शायद यह जांचना चाहते हैं कि यह डोम में है या नहीं। सामान में काम करने वाला कोई व्यक्ति स्पष्ट रूप से जानता है कि डीओएम से कैसे पूछताछ करें। –

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 और कोई डोम खोज नहीं। सबसे पहले शीर्ष अभिभावक (पूर्वज) खोजें। फिर देखें कि क्या यह दस्तावेज़ है।

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 (मैंने एक संस्करण को धन्यवाद दिया, धन्यवाद) –

संबंधित मुद्दे