আমি কীভাবে যাচাই করব যে কোনও জিকোয়ারি উপাদানটি ডিওমে রয়েছে?


147

যাক আমি একটি উপাদান সংজ্ঞায়িত করা যাক

$foo = $('#foo');

এবং তারপর আমি কল

$foo.remove()

কিছু ঘটনা থেকে। আমার প্রশ্ন হ'ল, আমি কীভাবে চেক করব যে ডিওএম থেকে oo foo সরানো হয়েছে কিনা? আমি খুঁজে পেয়েছি যে $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
@ পেরোআজুল: আমি একটি আরও দ্রুত বিকল্প পেয়েছি : jsperf.com/jquery-element-in-dom/2
স্ল্যাक्स

3
পারফরম্যান্সটি এই পদ্ধতির সাথে আমার তাত্ক্ষণিক উদ্বেগ ছিল, @ এসএলাকসকে মাপদণ্ডের সাথে যুক্ত করার জন্য ধন্যবাদ। সুতরাং দেখে মনে $.contains(document.documentElement, $foo.get(0))হচ্ছে এটি দ্রুততম উপায়।
ক্রিস্টোফ

10
এটি করার জন্য একটি খাঁটি-ডোম উপায় রয়েছে যা সিন্টেক্সিকভাবে আরও পঠনযোগ্য এবং আমি পারফরম্যান্সের ক্ষেত্রেও একইরকম কল্পনা করি:document.contains($foo[0])
জোয়েল ক্রস

3
পারফরম্যান্সের এই সমস্ত কথা ...? মানদণ্ডগুলি একটি পদ্ধতি দেখায় যা 15 টি মাইক্রোসেকেন্ড গ্রহণ করে এবং অন্যটি 0.15 মাইক্রোসেকেন্ড গ্রহণ করে। তবে প্রকৃতপক্ষে, কে যত্নশীল - আপনি যদি এটি এক লক্ষ বার না করেন তবে কোনও পার্থক্য লক্ষ্য করবেন না। JQuery বা জাভাস্ক্রিপ্ট ইঞ্জিনটি অপ্টিমাইজড হয়ে উঠলে এটি সমস্ত পরিবর্তিত হতে পারে J আপনার কাছে এবং ভবিষ্যতে আপনার কোডটি বজায় রাখার জন্য যাহা পদ্ধতি ভালভাবে পড়তে পারে কেবল তার ব্যবহার করুন।
জেমস


5

আমি আমার প্রশ্নটি টাইপ করার সাথে সাথে একটি উত্তর বুঝতে পেরেছিলাম: কল করুন Call

$foo.parent()

যদি $f00ডিওএম থেকে অপসারণ করা হয়, তবে$foo.parent().length === 0 । অন্যথায়, এর দৈর্ঘ্য কমপক্ষে 1 হবে।

[সম্পাদনা করুন: এটি সম্পূর্ণরূপে সঠিক নয়, কারণ সরানো উপাদানটির এখনও পিতামাতারা থাকতে পারে; উদাহরণস্বরূপ, আপনি যদি একটি অপসারণ <ul>করেন তবে এর প্রতিটি সন্তানের <li>এখনও পিতামাতা থাকবে। পরিবর্তে স্ল্যাকের উত্তর ব্যবহার করুন।


2
... যদি না সরানো নোড একমাত্র শিশু না হয়
vlvaro González

@ এলভারো - কেন ব্যাপার হবে?
ব্যবহারকারী 113716

@ পেট্রিক: আমি কিছু মিস করেছি? Length foo.parent () দৈর্ঘ্য শূন্যের চেয়ে বেশি হলে আপনি কী আশ্বাস দিতে পারেন?
আলভারো গঞ্জালেজ

@ এলভারো - ওপি ডিওএম $fooথেকে অপসারণ করা হয়েছে তা নিশ্চিত করে পরীক্ষা করছে । যদি এটি সফলভাবে মুছে ফেলা হয় তবে এর আর কোনও প্যারেন্ট উপাদান থাকবে না। সুতরাং এর $foo.parent().length === 0অর্থ হ'ল অপসারণটি সফল হয়েছিল।
ব্যবহারকারী 113716

1
oo 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 (ডকুমেন্ট.ডোকমেন্ট এলিমেন্ট, এলট [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;
}

আপনি যদি শূন্য উপরে এবং শূন্য বামে শূন্য প্রস্থ এবং উচ্চতা উপাদানের প্রান্ত কেসটি পরিচালনা করতে চান তবে আপনি ডকুমেন্ট পর্যন্ত পিতামাতার পুনরাবৃত্তি করে দ্বিগুণ চেক করতে পারবেন


যদিও এই কোড স্নিপেট সমস্যার সমাধান করতে পারে, এটি কেন বা কীভাবে প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করে না। আপনার কোডটির জন্য একটি ব্যাখ্যা অন্তর্ভুক্ত করুন , কারণ এটি সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। ফ্ল্যাগার্স / পর্যালোচক: কোড-উত্তরগুলির জন্য যেমন এই, ডাউনভোট, মুছবেন না!
লুকা কিবেল

এটি কি গোপন উপাদানগুলিকে "ডোমে নয়" হিসাবে স্বীকৃতি দেয়? উদাহরণস্বরূপ, এমন কোনও উপাদানটির display: noneকোনও সীমানা নেই
ফিলিপ


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)...?


@ স্টেমেট্যাডেভিয়েস প্রশ্নটি "প্রদত্ত জিকুয়ারি আইনের কোনও উপাদানটি ডিওমে রয়েছে কিনা তা পরীক্ষা করে কীভাবে করা যায়", "প্রদত্ত নির্বাচক স্ট্রিংয়ের সাথে মেলে এমন একটি উপাদান ডিওমে রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন" is
ট্রেভর বার্নহ্যাম

@ ট্র্যাভারবার্নহ্যাম: সমস্ত ন্যায্যতার সাথে, নির্বাচক তৈরি করতে ব্যবহার করে পুনরায় জিজ্ঞাসাবাদ করা $foo, এবং পুনরায় জিজ্ঞাসাটি কোনও উপাদানগুলির সাথে মিলেছে কিনা তা পরীক্ষা করে দেখা অনেক পরিস্থিতিতে দৃ vi় সমস্যার একটি কার্যকর সমাধান বলে মনে হয়। এমনকি jQuery এবং ব্রাউজারগুলি নির্দিষ্ট কিছু নির্বাচককে যেমন অনুকূলকরণ (যেমন আইডি দ্বারা) অপ্টিমাইজ করে তার কারণে এটি অন্যান্য সমাধানগুলির থেকে কিছুটা দ্রুত হয়ে যেতে পারে ।
ম্যাট

@ ম্যাট $ ফু সম্ভবত ডিওএম থেকে বিচ্ছিন্ন মেমোরির একটি উপাদান এবং আমার সাথে ডিওএম-তে নির্বাচক মেলানো কোনও উপাদান থাকতে পারে। এই প্রশ্নের উত্তর খুঁজছেন লোকেরা সম্ভবত এটি ডিওমে রয়েছে কিনা তা পরীক্ষা করতে চায়। এর মতো স্টাফগুলিতে কাজ করা কেউ স্পষ্টতই DOM- কে কীভাবে জিজ্ঞাসা করবেন তা জানেন।
টিজে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.