मैं कैसे जांच करूं कि क्या कोई jQuery तत्व DOM में है?


147

मान लीजिए कि मैं एक तत्व को परिभाषित करता हूं

$foo = $('#foo');

और फिर मैं फोन करता हूं

$foo.remove()

किसी घटना से। मेरा प्रश्न यह है कि मैं कैसे जांचूं कि $ foo को DOM से निकाला गया है या नहीं? मुझे लगता है कि $foo.is(':hidden')काम करता है, लेकिन यह भी सच है अगर मैं सिर्फ कहा जाता है $foo.hide()

जवाबों:


238

ऐशे ही:

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

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


14
करना $foo.closest(document.documentElement)तेज है (अगर किसी को भी jsperf.com/jquery-element-in-dom की परवाह है )
urraka

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

3
इस पद्धति के साथ प्रदर्शन मेरी तत्काल चिंता थी, बेंचमार्क @ एसएलएसी को जोड़ने के लिए धन्यवाद। तो ऐसा लगता $.contains(document.documentElement, $foo.get(0))है कि सबसे तेज़ तरीका है।
क्रिस्टोफ़

10
ऐसा करने के लिए एक शुद्ध-डीओएम तरीका है, जो वाक्यात्मक रूप से अधिक पठनीय है, और मैं प्रदर्शन के मामले में बहुत ही समान कल्पना करता हूं:document.contains($foo[0])
जोएल क्रॉस

3
ये सब प्रदर्शन की बात ...? बेंचमार्क एक विधि को 15 माइक्रोसेकंड लेता है, और दूसरा 0.15 माइक्रोसेकंड लेता है। लेकिन वास्तव में, कौन परवाह करता है - आप किसी भी अंतर को नोटिस नहीं करने जा रहे हैं जब तक कि आप इसे एक लाख बार नहीं करते हैं। और यह सब बदल सकता है अगर jQuery या जावास्क्रिप्ट इंजन का अनुकूलन हो जाता है। बस जो भी विधि आपको बेहतर पढ़ती है और जो भी आपके कोड को भविष्य में बनाए रखना है, उसका उपयोग करें।
जेम्स


5

मुझे सिर्फ एक उत्तर का एहसास हुआ क्योंकि मैं अपना प्रश्न टाइप कर रहा था: कॉल करें

$foo.parent()

यदि $f00डोम से हटा दिया गया है, तो $foo.parent().length === 0। अन्यथा, इसकी लंबाई कम से कम 1 होगी।

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


2
... जब तक हटाए गए नोड एकमात्र बच्चा नहीं था
41lvaro González

@ Álvaro - वह बात क्यों होगी?
user113716

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

@ Surelvaro - ओपी यह सुनिश्चित करने के लिए परीक्षण कर रहा है कि $fooउसे डोम से हटा दिया गया था। यदि इसे सफलतापूर्वक हटा दिया गया था, तो इसमें अब मूल तत्व नहीं होगा। इसलिए $foo.parent().length === 0इसका मतलब है कि निष्कासन सफल रहा।
user113716

1
$ foo.closest ("बॉडी") इस तकनीक के लिए एक फिक्स होगा
जार्जफिलिप्स

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, elt [0]) के समतुल्य है।


3

संभवतः सबसे प्रदर्शन का तरीका है:

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

एमडीएन से स्रोत

ध्यान दें:


किसी ने अभी तक इस जवाब को कैसे देखा है? शानदार उत्तर +1 (मैंने एक संस्करण प्राप्त किया, धन्यवाद)
गुइलेरमे नैसिमेंटो

1

मुझे यह तरीका पसंद आया। कोई jQuery और कोई DOM सर्च नहीं। पहले शीर्ष माता-पिता (पूर्वज) को खोजें। फिर देखें कि क्या यह दस्तावेज है।

function ancestor(HTMLobj){
  while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement}
  return HTMLobj;
}
function inTheDOM(obj){
  return ancestor(obj)===document.documentElement;
}

1

माता-पिता को पुनरावृत्त करने के बजाय आप केवल बाउंडिंग रेक्ट प्राप्त कर सकते हैं जो कि सभी शून्य है जब तत्व को डोम से अलग किया जाता है

function isInDOM(element) {
    var rect=element.getBoundingClientRect();
    return (rect.top || rect.bottom || rect.height || rect.width)?true:false;
}

यदि आप शून्य चौड़ाई और ऊंचाई तत्व के किनारे के मामले को शून्य से ऊपर और शून्य छोड़ना चाहते हैं, तो आप दस्तावेज़ तक माता-पिता को पुन: जाँच कर दोहरा सकते हैं।


हालांकि यह कोड स्निपेट समस्या को हल कर सकता है, यह इस बात की व्याख्या नहीं करता है कि यह प्रश्न का उत्तर क्यों या कैसे देता है। कृपया अपने कोड के लिए एक स्पष्टीकरण शामिल करें , क्योंकि यह वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। ध्वजवाहक / समीक्षक: केवल इस तरह के उत्तर के रूप में कोड के लिए, नीचे, हटाएं नहीं!
लुका कीबेल

क्या यह छिपे हुए तत्वों को "DOM में नहीं" के रूप में भी पहचानता है? एक तत्व के साथ जैसे display: noneकोई सीमा नहीं है या तो
फिलिप

0

पेरो की टिप्पणी से सहमत हैं। इसे इस तरह भी किया जा सकता है:

$foo.parents().last().is(document.documentElement);

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

-1

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


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

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

@Matt $ foo, DOM से अलग की गई मेमोरी में एक तत्व हो सकता है, और DOM में चयनकर्ता के साथ एक तत्व हो सकता है। इस सवाल का जवाब तलाश रहे लोग शायद यह जांचना चाहते हैं कि यह डोम में है या नहीं। सामान में काम करने वाला कोई व्यक्ति स्पष्ट रूप से डोम को क्वेरी करना जानता है।
TJ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.