ভাইবোন নোডগুলি নির্বাচন করার কোনও উপায় আছে?


110

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

উদাহরণ স্বরূপ,

<div id="outer">
  <div id="inner1"></div>
  <div id="inner2"></div>
  <div id="inner3"></div>
  <div id="inner4"></div>
</div>

যদি আমি অভ্যন্তরীণ নোডটি নির্বাচন করি তবে এর ভাইবোন, inner2-4নোডগুলি অ্যাক্সেস করার কোনও উপায় কি আমার জন্য রয়েছে ?

উত্তর:


147

ঠিক আছে ... নিশ্চিত ... কেবলমাত্র পিতামাতার এবং তারপরে বাচ্চাদের অ্যাক্সেস করুন।

 node.parentNode.childNodes[]

বা ... jQuery ব্যবহার করে:

$('#innerId').siblings()

সম্পাদনা করুন: ক্ল্যাটাস সর্বদা হিসাবে অনুপ্রেরণামূলক। আমি আরও খনন। এইভাবে jQuery ভাইবোনদের মূলত:

function getChildren(n, skipMe){
    var r = [];
    for ( ; n; n = n.nextSibling ) 
       if ( n.nodeType == 1 && n != skipMe)
          r.push( n );        
    return r;
};

function getSiblings(n) {
    return getChildren(n.parentNode.firstChild, n);
}

23
নোট করুন যে jquery.siblings () ফলাফল সেট থেকে বর্তমান নোড বাদ দেয়।
ক্লিটাস

4
যা খুব সুন্দর বৈশিষ্ট্য!
সিজিপি

4
আসলে jquery এ নোড.প্যারেন্টনোড.চাইল্ড নোডের সমতুল্য হ'ল প্রকৃতপক্ষে $ (নোড) p পিতামাতার ()। শিশুরা () না $ (নোড)। ভাইবোন ()। এটি একটি দুর্দান্ত বৈশিষ্ট্য হতে পারে তবে এটি বিরক্তিকরও হতে পারে। এটি নির্ভর করে তুমি কি চাও।
ক্লিটাস

4
আপনি নোড.প্যারেন্টনোড.চাইল্ড নোড সহ ELEMENT_NODE নোডগুলি পরীক্ষা করতে চান, কারণ এটি আপনাকে সাদা স্পেস টেক্সট নোডগুলিও দেবে।
seanmonstar

কিছুই না, আমি মনে করি এটি একটি বোকা - এর জন্য দুঃখিত (সরানো)
cgp

104
var sibling = node.nextSibling;

এটি তার ঠিক পরে ভাইবোনকে ফিরিয়ে দেবে, বা আর কোনও ভাইবোন উপলব্ধ নেই। তেমনি, আপনি ব্যবহার করতে পারেন previousSibling

[সম্পাদনা] দ্বিতীয় চিন্তায়, এটি পরবর্তী divট্যাগটি দেবে না , তবে নোডের পরে সাদা স্থান ace আরও ভাল বলে মনে হচ্ছে

var sibling = node.nextElementSibling;

এছাড়াও আছে একটি previousElementSibling


4
পরের / পূর্ববর্তী সেমিলিং আইই 8
ভাদিম

4
আইই 9 থেকে শুরু হচ্ছে এটি। এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
জিজ্ঞাসাগুলি /

14

দ্রুত:

var siblings = n => [...n.parentElement.children].filter(c=>c!=n)

https://codepen.io/anon/pen/LLoyrP?editors=1011

অভিভাবকদের বাচ্চাদের অ্যারে হিসাবে পান, এই উপাদানটি ফিল্টার করুন।

সম্পাদনা করুন:

এবং পাঠ্য নোডগুলি ফিল্টার আউট করতে (ধন্যবাদ পিএমরোটুল ):

var siblings = n => [...n.parentElement.children].filter(c=>c.nodeType == 1 && c!=n)

4
সুন্দর সমাধান। যদিও, আমি পাঠ্য নোডটি বাতিল করতে নোডটাইপের জন্য যাচাই [ ...n.parentNode.children ].filter(c => c.nodeType == 1 && c != n)
করতাম

টাইপস্ক্রিপ্টের জন্য আপনি কীভাবে এটি পরিবর্তন করবেন?
নিক স্কোজজারো

10

2017 থেকে:
সরল উত্তর: element.nextElementSiblingসঠিক উপাদান সহোদর পেতে। আপনি element.previousElementSiblingআগের এক জন্য আছে

এখান থেকে পরের সমস্ত ভাইবোন পাওয়া খুব সহজ

var n = element, ret = [];
while (n = n.nextElementSibling){
  ret.push(n)
}
return ret;

এটি সমস্ত ভাইবোনকে ফিরিয়ে দেওয়া উচিত, কেবল nextবা নয় previous। ঠিক পিছনে বা এগিয়ে যাওয়া সুনির্দিষ্টভাবে এই ক্ষেত্রে খুব বেশি সহায়তা করে না।
ডিভলডেন

4
কেন না. আপনি যদি পরবর্তী এবং পূর্বের গ্রহণ করেন তবে আপনি পুরো ছবিটি পেতে পারেন। এই উত্তরটি আসে জিনিসগুলি করার একটি নতুন উপায় দেখানোর জন্য। এবং পাঠকদের জন্য কিছু অবদান। কেবল পিতা-মাতাকে যেতে এবং প্রতিটি উপাদানটিতে যেতে এবং প্রত্যেকে যা করতে পারে তার বর্তমান ফিল্টার করতে
pery mimon

6

আপনি কি jQuery এ "ভাইবোন" পদ্ধতিটি পরীক্ষা করেছেন?

    sibling: function( n, elem ) {
        var r = [];

        for ( ; n; n = n.nextSibling ) {
            if ( n.nodeType === 1 && n !== elem ) {
                r.push( n );
            }
        }

        return r;
    }

n.nodeType == 1 উপাদানটি এইচটিএমএল নোড এবং এন! == বর্তমান উপাদানটি বাদ দেয় কিনা তা পরীক্ষা করে দেখুন।

আমি মনে করি আপনি একই ফাংশনটি ব্যবহার করতে পারেন, সমস্ত কোডটি ভ্যানিলা জাভাস্ক্রিপ্ট বলে মনে হয়।


6

এটি করার কয়েকটি উপায় রয়েছে।

নিম্নলিখিতগুলির যে কোনও একটিটি কৌশলটি করা উচিত।

// METHOD A (ARRAY.FILTER, STRING.INDEXOF)
var siblings = function(node, children) {
    siblingList = children.filter(function(val) {
        return [node].indexOf(val) != -1;
    });
    return siblingList;
}

// METHOD B (FOR LOOP, IF STATEMENT, ARRAY.PUSH)
var siblings = function(node, children) {
    var siblingList = [];
    for (var n = children.length - 1; n >= 0; n--) {
        if (children[n] != node) {
            siblingList.push(children[n]);
        }  
    }
    return siblingList;
}

// METHOD C (STRING.INDEXOF, ARRAY.SPLICE)
var siblings = function(node, children) {
   siblingList = children;
   index = siblingList.indexOf(node);
   if(index != -1) {
       siblingList.splice(index, 1);
   }
   return siblingList;
}

এফওয়াইআই: jQuery কোড-বেস গ্রেড এ জাভাস্ক্রিপ্ট পর্যবেক্ষণের জন্য একটি দুর্দান্ত উত্স।

এখানে একটি দুর্দান্ত সরঞ্জাম যা jQuery কোড-বেসকে খুব সুবিন্যস্ত উপায়ে প্রকাশ করে। http://james.padolsey.com/jquery/


3

আপনি কীভাবে আগের, পরবর্তী এবং সমস্ত ভাইবোন (উভয় পক্ষ) পেতে পারেন তা এখানে:

function prevSiblings(target) {
   var siblings = [], n = target;
   while(n = n.previousElementSibling) siblings.push(n);
   return siblings;
}

function nextSiblings(target) {
   var siblings = [], n = target;
   while(n = n.nextElementSibling) siblings.push(n);
   return siblings;
}

function siblings(target) {
    var prev = prevSiblings(target) || [],
        next = nexSiblings(target) || [];
    return prev.concat(next);
}

2

ব্যবহারের document.querySelectorAll () এবং loops এবং পুনরাবৃত্তির

function sibblingOf(children,targetChild){
  var children = document.querySelectorAll(children);
  for(var i=0; i< children.length; i++){
    children[i].addEventListener("click", function(){
      for(var y=0; y<children.length;y++){children[y].classList.remove("target")}
      this.classList.add("target")
    }, false)
  }
}

sibblingOf("#outer >div","#inner2");
#outer >div:not(.target){color:red}
<div id="outer">
      <div id="inner1">Div 1 </div>
      <div id="inner2">Div 2 </div>
      <div id="inner3">Div 3 </div>
      <div id="inner4">Div 4 </div>
 </div>


1

jQuery

$el.siblings();

নেটিভ - সর্বশেষ, এজ 13 +

[...el.parentNode.children].filter((child) =>
  child !== el
);

নেটিভ (বিকল্প) - সর্বশেষ, এজ 13 +

Array.from(el.parentNode.children).filter((child) =>
  child !== el
);

নেটিভ - IE10 +

Array.prototype.filter.call(el.parentNode.children, (child) =>
  child !== el
);

0
var childNodeArray = document.getElementById('somethingOtherThanid').childNodes;

উইন্ডো.ডোকামেন্ট.ডোকমেন্টএলমেন্ট.চাইল্ড নোডস [১] .চিল্ড নোডস [৪] হাওটোক্রেইট.কম
থান্ডারবোল্টজ

এটা কি আদৌ প্রশ্নের সমাধান?
zahid9i

এটি হাতের মুঠোয় সমস্যার সমাধান করে না, বা কমপক্ষে স্পষ্টভাবে কার্যকর হওয়ার পক্ষে যথেষ্ট নয়।
সিডেসাক

0

1) টার্গেট এলিমেন্টে নির্বাচিত ক্লাস যুক্ত করুন
2) টার্গেট এলিমেন্ট বাদে প্যারেন্ট এলিমেন্টের সমস্ত বাচ্চাদের সন্ধান করুন
3) টার্গেট এলিমেন্ট থেকে ক্লাস সরিয়ে ফেলুন

 <div id = "outer">
            <div class="item" id="inner1">Div 1 </div>
            <div class="item" id="inner2">Div 2 </div>
            <div class="item" id="inner3">Div 3 </div>
            <div class="item" id="inner4">Div 4 </div>
           </div>



function getSiblings(target) {
    target.classList.add('selected');
    let siblings = document.querySelecttorAll('#outer .item:not(.currentlySelected)')
    target.classList.remove('selected'); 
return siblings
    }

0

নিম্নলিখিত ফাংশন প্রদত্ত উপাদানটির সমস্ত ভাইবোন সমন্বিত একটি অ্যারে প্রদান করবে।

function getSiblings(elem) {
    return [...elem.parentNode.children].filter(item => item !== elem);
}

নির্বাচিত উপাদানটিকে getSiblings()কেবলমাত্র পরামিতি হিসাবে ফাংশনে পাস করুন ।


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