JQuery ছাড়া নিকটতম উপাদান সন্ধান করা


90

আমি jquery ছাড়াই একটি নির্দিষ্ট ট্যাগ নামের সাথে নিকটতম উপাদানটি সন্ধান করার চেষ্টা করছি। আমি যখন কোনটিতে ক্লিক করি তখন আমি সেই টেবিলটির জন্য <th>অ্যাক্সেস পেতে চাই <tbody>। পরামর্শ? আমি অফসেট সম্পর্কে পড়েছি কিন্তু আসলে এটি খুব বেশি বুঝতে পারি নি। আমার কি কেবল ব্যবহার করা উচিত:

ধরুন ইতিমধ্যে ক্লিক করা তম উপাদানটিতে সেট করা আছে

th.offsetParent.getElementsByTagName('tbody')[0]

4
যদি আপনি দেখতে পান যে আপনাকে অবশ্যই ডিওএমের মাধ্যমে ট্র্যাভারিং শুরু করতে হবে এটি একটি উদাহরণ যেখানে jquery এর সাথে যুক্ত অতিরিক্ত কেবিএস এটির জন্য উপযুক্ত।
কেভিন বোয়ারক্সক্স


4
আমি মনে করি এটি একটি খুব গুরুত্বপূর্ণ এবং বৈধ প্রশ্ন। ডাউনভোটদের কোনও কারণ নেই।

el.closest('tbody')অ-অর্থাৎ ব্রাউজারগুলির জন্য। নীচে আরও বিস্তৃত উত্তর + পলফিল দেখুন।
অরিয়াদাম

উত্তর:


69

পার্টিতে অল্প (খুব) দেরি হলেও তবুও। এটি কৌশলটি করা উচিত :

function closest(el, selector) {
    var matchesFn;

    // find vendor prefix
    ['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn) {
        if (typeof document.body[fn] == 'function') {
            matchesFn = fn;
            return true;
        }
        return false;
    })

    var parent;

    // traverse parents
    while (el) {
        parent = el.parentElement;
        if (parent && parent[matchesFn](selector)) {
            return parent;
        }
        el = parent;
    }

    return null;
}

4
দুর্দান্ত উত্তর যা ট্রিট কাজ করে। এমডিএন-তেও এলিমেন্ট.কোলেস্ট () এর জন্য একটি পলিফিল রয়েছে। ক্রোমটিতে বর্তমান রিলিজে এলিমেন্ট.ম্যাচগুলি () অন্তর্ভুক্ত রয়েছে, সুতরাং কোনও উপসর্গের প্রয়োজন নেই। ক্লিবু, আমি যে অ্যাপ্লিকেশনটি বিকাশ করছি তার মধ্যে আমি এমন একটি লিবে যুক্ত করেছি।
nevf

4
আমি কোডটি পরিবর্তন করেছি যাতে এটি eljQuery.closest () এবং এলিমেন্টক্লোজেস্ট () যা করে এমন উপাদানগুলিরও পরীক্ষা করে। for( var parent = el ; parent !== null && !parent[matchesFn](selector) ; parent = el.parentElement ){ el = parent; } return parent;
nevf

4
এই কোডটি ভাল, তবে এটি একটি সেমিকোলন অনুপস্থিত parentএবং বৈশ্বিক সুযোগ (!)
স্টিভেন লু

4
মূল্য উল্লেখ করার হতে পারে: developer.mozilla.org/en-US/docs/Web/API/Element/closest নেটিভ পদ্ধতি নিকটতম জন্য, যদিও সাপোর্টে সামান্য কম: Chrome41, FF35, ইন্টারনেট-না, Opera28, Safari9
Michiel ডি

এই সম্পর্কিত একটি নোট, আপনি করতে চাইতে পারেন el.parentNodeবা আইই-তে কোনও এসভিজির ট্র্যাভার করার সময় এটি ভেঙে যাবে।
স্মকা

124

খুব সহজ:

el.closest('tbody')

আইই ব্যতীত সমস্ত ব্রাউজারে সমর্থিত।
আপডেট : এজ এখন এটি সমর্থন করে।

JQuery প্রয়োজন নেই। আরও বেশি, jQuery এর $(this).closest('tbody')সাথে প্রতিস্থাপন করা $(this.closest('tbody'))কর্মক্ষমতা বাড়িয়ে তুলবে, উল্লেখযোগ্যভাবে যখন উপাদানটি খুঁজে পাওয়া যায় না।

আই-এর জন্য পলিফিল:

if (!Element.prototype.matches) Element.prototype.matches = Element.prototype.msMatchesSelector;
if (!Element.prototype.closest) Element.prototype.closest = function (selector) {
    var el = this;
    while (el) {
        if (el.matches(selector)) {
            return el;
        }
        el = el.parentElement;
    }
};

দ্রষ্টব্য যে returnযখন উপাদানটি পাওয়া যায় নি তখন সেখানে নেই, যখন undefinedনিকটতম উপাদানটি পাওয়া যায় নি তখন কার্যকরভাবে ফিরে আসত।

আরও তথ্যের জন্য দেখুন: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest


4
এই উত্তরটি পৃষ্ঠার নীচে কেন? শীর্ষে থাকা উচিত। অনেক অনেক ধন্যবাদ
জুলিয়েন লে কপানেক

নিকটতমটি jQuery- এ রয়েছে তবে ওপি কোনও jQuery বলে না।
স্টিভ মোরেটজ

@ স্টেভমোর্টজ নিকটতম এখন স্থানীয় জাভাস্ক্রিপ্ট
লুইস এগলটন

@ লুইসএগলটন হ্যাঁ এটি হ'ল, উফ
স্টিভ মোর্টজ

এটিকে সেরা উত্তর বলে!
চয়ন করা হয়েছে

22

আপনি এখানে jQuery ছাড়াই ট্যাগ নামে নিকটতম উপাদানটি পান কীভাবে:

function getClosest(el, tag) {
  // this is necessary since nodeName is always in upper case
  tag = tag.toUpperCase();
  do {
    if (el.nodeName === tag) {
      // tag name is found! let's return it. :)
      return el;
    }
  } while (el = el.parentNode);

  // not found :(
  return null;
}

getClosest(th, 'tbody');

4
আমি বিশ্বাস করি না এটি কাজ করবে। এটি কেবল ডিওএম ট্রি পরীক্ষা করে। th-> thead-> টেবিল কখনই ভাইবোনদের বিবেচনা করে না
শিকারি

4
আপনার প্রশ্নে আপনার সেই নির্দিষ্ট কেসটি থাকা উচিত।
জুন

4
দেখুন এই ফাংশনটি প্রদত্ত ট্যাগটি ব্যবহার করে এমন নিকটতম অভিভাবককে (এমনকি এক্সটেনশন দ্বারা) সন্ধান করতে প্যারেন্ট নোডগুলিকে অনুসরণ করে। এটি নথির গাছ "নীচে" যাবে না, কেবল "উপরে" থাকবে। গড় ব্যবহারকারীর সবচেয়ে কাছের ভাইবোন হিসাবে সম্ভবত "নিকটতম" নোডটি দেখতে পাবেন। তিনি কেবল তাঁর প্রয়োজনীয় পরিভাষাটি জানেন না।

4
@ জাভিন্সের প্রতি ন্যায়বিচারে আপনার নিকটতম সংজ্ঞাটি হল jQuery পদগুলি নিকটতম। এটি কোনও jQuery প্রশ্ন নয়। জিক্যুরি কেন নিকটতম মানে নিকটতম পূর্বপুরুষের সিদ্ধান্ত নিয়েছে তা আমি প্রমাণ করতে পারি না, তবে এর চেয়ে বেশি যুক্তিসঙ্গত সংজ্ঞা হ'ল পিতা-মাতা, পূর্ববর্তী ভাইবোন, পরবর্তী ভাইবোন ইত্যাদি যাই হোক না কেন লক্ষ্য উপাদানটির সাথে "নিকটতম" দেখা যায়।
ryandlf

4
@ রাইন্ডল্ফ তবে যদি আপনার "বাবা" এবং ভাইবোন উভয় একই "দূরত্বে" থাকেন তবে? jQuery এর সংজ্ঞা স্পষ্ট যে এটি সর্বাধিক একটি ম্যাচ ফিরবে।
এমটোন

9

এটি করার জন্য একটি স্ট্যান্ডার্ডাইজড ফাংশন রয়েছে: এলিমেন্ট.ক্লসোস্ট । আইই 11 ব্যতীত বেশিরভাগ ব্রাউজার এটিকে সমর্থন করে ( caniuse.com দ্বারা বিশদ বিবরণ )। MDN ডক্স একটি polyfill যদি আপনি পুরোনো ব্রাউজারে লক্ষ্য আছে অন্তর্ভুক্ত।

tbodyপ্রদত্ত নিকটতম পিতামাতার সন্ধানের জন্য thআপনি যা করতে পারেন:

th.closest('tbody');

আপনি যদি নিজে ফাংশনটি লিখতে চান - আমি এখানে এলাম:

function findClosestParent (startElement, fn) {
  var parent = startElement.parentElement;
  if (!parent) return undefined;
  return fn(parent) ? parent : findClosestParent(parent, fn);
}

ট্যাগ নামের দ্বারা নিকটতম পিতামাতার সন্ধানের জন্য আপনি এটি ব্যবহার করতে পারেন:

findClosestParent(x, element => return element.tagName === "SECTION");

6
function closest(el, sel) {
    if (el != null)
        return el.matches(sel) ? el 
            : (el.querySelector(sel) 
                || closest(el.parentNode, sel));
}

এই সমাধানটি এইচটিএমএল 5 স্পিকারের সাম্প্রতিকতম কয়েকটি বৈশিষ্ট্য ব্যবহার করে এবং এটি পুরানো / বেমানান ব্রাউজারগুলিতে (পড়ুন: ইন্টারনেট এক্সপ্লোরার) ব্যবহার করে একটি পলিফিল লাগবে।

Element.prototype.matches = (Element.prototype.matches || Element.prototype.mozMatchesSelector 
    || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector 
    || Element.prototype.webkitMatchesSelector || Element.prototype.webkitMatchesSelector);

এটি সর্বদা প্রথম টেবিলে যায়। নিকটতম টেবিল নয় .. jsfiddle.net/guuy5kof
বালচন্দ্রন

চমৎকার ধরা! স্থির, এখানে দেখুন jsfiddle.net/c2pqc2x0 দয়া করে আমাকে বসের মতো উঁচু করুন :)
ম্যাথু জেমস ডেভিস

হ্যাঁ আমি অসুস্থ হয়ে পড়েছি ... আপনি কি আপনার ফিডাল ফলাফলটি পরীক্ষা করেছেন, এটি ত্রুটি দেখায় .. ম্যাচগুলি অপরিবর্তিত
বালচন্দ্রন

আমার জন্য দুর্দান্ত কাজ করে আপনি কোন ব্রাউজারে কাজ করছেন? এটি পুরানো ব্রাউজারগুলিতে সমর্থিত নয়
ম্যাথু জেমস ডেভিস

আরে পরিষ্কার করে দিন যে আপনি কী বলেন ব্রাউজ করুন
ম্যাথু জেমস ডেভিস

3

@ সালমানপিকে উত্তর প্রসারিত করতে

এটি নির্বাচক হিসাবে নোড ব্যবহার করার অনুমতি দেবে, যখন আপনি মাউসওভারের মতো ইভেন্টগুলির সাথে কাজ করছেন তখন দরকারী।

function closest(el, selector) {
    if (typeof selector === 'string') {
        matches = el.webkitMatchesSelector ? 'webkitMatchesSelector' : (el.msMatchesSelector ? 'msMatchesSelector' : 'matches');
        while (el.parentElement) {
            if (el[matches](selector)) {
                return el
            };
            el = el.parentElement;
        }
    } else {
        while (el.parentElement) {
            if (el === selector) {
                return el
            };
            el = el.parentElement;
        }
    }

    return null;
}

2

আমি যে সাধারণ ফাংশনটি ব্যবহার করছি তা এখানে:

function closest(el, selector) {
    var matches = el.webkitMatchesSelector ? 'webkitMatchesSelector' : (el.msMatchesSelector ? 'msMatchesSelector' : 'matches');

    while (el.parentElement) {
        if (el[matches](selector)) return el;

        el = el.parentElement;
    }

    return null;
}

2

সারসংক্ষেপ:

একটি নির্দিষ্ট পূর্বপুরুষের সন্ধানের জন্য আমরা ব্যবহার করতে পারি:

Element.closest();

এই ফাংশনটি একটি সিএসএস নির্বাচক স্ট্রিংকে আর্গুমেন্ট হিসাবে গ্রহণ করে। এরপরে এটি বর্তমান উপাদানটির নিকটতম পূর্বপুরুষকে (বা নিজেই উপাদানটি) ফেরত দেয় যা সিএসএস নির্বাচকের সাথে মেলে যা আর্গুমেন্টে পাস হয়েছিল। পূর্বপুরুষ না থাকলে এটি ফিরে আসবে null

উদাহরণ:

const child = document.querySelector('.child');
// select the child

console.dir(child.closest('.parent').className);
// check if there is any ancestor called parent
<div class="parent">
  <div></div>
  <div>
    <div></div>
    <div class="child"></div>
  </div>
</div>


1

গাছটিতে একটি ক্লাস, আইডি, ডেটা অ্যাট্রিবিউট, বা ট্যাগ থাকা সবচেয়ে কাছের ডিওএম উপাদান পান। উপাদান নিজেই অন্তর্ভুক্ত। IE6 এ ফিরে সমর্থনযুক্ত।

var getClosest = function (elem, selector) {

    var firstChar = selector.charAt(0);

    // Get closest match
    for ( ; elem && elem !== document; elem = elem.parentNode ) {

        // If selector is a class
        if ( firstChar === '.' ) {
            if ( elem.classList.contains( selector.substr(1) ) ) {
                return elem;
            }
        }

        // If selector is an ID
        if ( firstChar === '#' ) {
            if ( elem.id === selector.substr(1) ) {
                return elem;
            }
        } 

        // If selector is a data attribute
        if ( firstChar === '[' ) {
            if ( elem.hasAttribute( selector.substr(1, selector.length - 2) ) ) {
                return elem;
            }
        }

        // If selector is a tag
        if ( elem.tagName.toLowerCase() === selector ) {
            return elem;
        }

    }

    return false;

};

var elem = document.querySelector('#some-element');
var closest = getClosest(elem, '.some-class');
var closestLink = getClosest(elem, 'a');
var closestExcludingElement = getClosest(elem.parentNode, '.some-class');

firstCharসমস্ত IFঅবস্থার পরিবর্তে কেন একটি স্যুইচ ব্যবহার করবেন না ?
রাফায়েল হার্সকোভিচি

কেন একটি অস্পষ্ট forলুপ ব্যবহার করবেন ?
রাফায়েল হার্সকোভিচি

1

নিকটতম উপাদানসমূহের চাইল্ডনোডগুলি সন্ধান করুন।

closest:function(el, selector,userMatchFn) {
var matchesFn;

// find vendor prefix
['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn) {
    if (typeof document.body[fn] == 'function') {
        matchesFn = fn;
        return true;
    }
    return false;
});
function findInChilds(el){
    if(!el) return false;
    if(el && el[matchesFn] && el[matchesFn](selector)

    && userMatchFn(el) ) return [el];
    var resultAsArr=[];
    if(el.childNodes && el.childNodes.length){
        for(var i=0;i< el.childNodes.length;i++)
        {
             var child=el.childNodes[i];
             var resultForChild=findInChilds(child);
            if(resultForChild instanceof Array){
                for(var j=0;j<resultForChild.length;j++)
                {
                    resultAsArr.push(resultForChild[j]);
                }
            } 
        }

    }
    return resultAsArr.length?resultAsArr: false;
}

var parent;
if(!userMatchFn || arguments.length==2) userMatchFn=function(){return true;}
while (el) {
    parent = el.parentElement;
    result=findInChilds(parent);
    if (result)     return result;

    el = parent;
}

return null;

}


0

এখানে.

function findNearest(el, tag) {
    while( el && el.tagName && el.tagName !== tag.toUpperCase()) {
        el = el.nextSibling;     
    } return el;
} 

গাছের নীচে কেবল ভাইবোনদেরই খুঁজে পাওয়া যায়। ব্যবহারের previousSibling উভয় উপায় এবং বিনিময়ে যেটা প্রথম পাওয়া যায়, তর্ক করার জন্য অন্য উপায় বা ব্যবহার ভেরিয়েবল যান। আপনি সাধারণ ধারণাটি পান তবে আপনি যদি পিতামাতার নোড বা বাচ্চাদের সাথে যোগাযোগ করতে চান তবে কোনও ভাইবোন যদি মেলে না তবে আপনি ভালভাবে jQuery ব্যবহার করতে পারেন। এই মুহুর্তে এটি সহজেই এটি মূল্যবান।


0

পার্টিতে কিছুটা দেরি হয়ে গেছে, তবে আমি যখন যাচ্ছিলাম এবং খুব অনুরূপ একটি প্রশ্নের উত্তর দিয়েছিলাম, আমি আমার সমাধানটি এখানে রেখে দিচ্ছি - আমরা বলতে পারি এটি জিকুয়ের closest()পদ্ধতির, তবে সাধারণ জাভাস্ক্রিপ্টের জন্য সহজ।

এটির জন্য কোনও পলিফিলের প্রয়োজন নেই এবং এটির পুরানো ব্রাউজারগুলি এবং আইই (:-)) বন্ধুত্বপূর্ণ: https://stackoverflow.com/a/48726873/2816279


-4

আমি মনে করি নিকটস্থ jquery সঙ্গে ধরা সবচেয়ে সহজ কোড:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        $(".add").on("click", function () {
            var v = $(this).closest(".division").find("input[name='roll']").val();
            alert(v);
        });
    });
</script>
<?php

for ($i = 1; $i <= 5; $i++) {
    echo'<div class = "division">'
        . '<form method="POST" action="">'
        . '<p><input type="number" name="roll" placeholder="Enter Roll"></p>'
        . '<p><input type="button" class="add" name = "submit" value = "Click"></p>'
        . '</form></div>';
}
?>

অনেক ধন্যবাদ.

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