শিশু নোড পাওয়ার সর্বোত্তম উপায়


233

আমি ভাবছিলাম, জাভাস্ক্রিপ্ট যে কোনও উপাদান থেকে প্রথম সন্তানের উপাদান পাওয়ার জন্য বিভিন্ন পদ্ধতি সরবরাহ করে, তবে কোনটি সেরা? সর্বোপরি, আমার অর্থ: বেশিরভাগ ক্রস ব্রাউজার সুসংগত, দ্রুত, সবচেয়ে বিস্তৃত এবং অনুমানযোগ্য যখন এটি আচরণের ক্ষেত্রে আসে। উপাধি হিসাবে আমি ব্যবহার করি এমন পদ্ধতি / বৈশিষ্ট্যের একটি তালিকা:

var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]

এটি উভয় ক্ষেত্রেই কাজ করে:

var child = elem.childNodes[0]; // or childNodes[1], see below

এটি ফর্ম বা <div>পুনরাবৃত্তির ক্ষেত্রে। আমি যদি পাঠ্য উপাদানগুলির মুখোমুখি হতে পারি:

var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;

আমি যতদূর কাজ করতে পারি, firstChildনোডলিস্ট ব্যবহার করে childNodesএবং firstElementChildব্যবহার করে children। আমি এই ধারণাটি এমডিএন রেফারেন্সের ভিত্তিতে করছি:

childNodeউপাদান নোডের প্রথম শিশু উপাদানটির একটি উল্লেখ, বা nullযদি না থাকে তবে or

আমি অনুমান করছি যে, গতির দিক থেকে, পার্থক্যটি যদি কোনওরকম হয় না, যেহেতু firstElementChildকার্যকরভাবে একটি রেফারেন্স children[0], এবং childrenবস্তু যেভাবেই মেমরিতে ইতিমধ্যে রয়েছে।

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

console.log(elem.childNodes[0]);
console.log(elem.firstChild);

উভয় লগ <TextNode textContent="\n ">

console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);

সমস্ত লগ <input type="text">। কিভাবে? আমি বুঝতে পেরেছি যে একটি বস্তু আমাকে "কাঁচা" এইচটিএমএল কোড দিয়ে কাজ করার অনুমতি দেবে, অন্যদিকে ডিওমে আটকে থাকলেও childNodesউপাদানটি উভয় স্তরে কাজ করে বলে মনে হচ্ছে।

আমার প্রাথমিক প্রশ্নের কাছে ফিরে আসতে আমার অনুমানটি childNodesহ'ল : যদি আমি সর্বাধিক বিস্তৃত বস্তু চাই, তবে সেটাই হল উপায়, তবে এর ব্যাপকতার কারণে এটি যে উপাদানটি আমি চাই / তা প্রত্যাবর্তন করার ক্ষেত্রে এটি সম্ভবত সবচেয়ে অনুমানযোগ্য হতে পারে না / যে কোনও মুহুর্তে প্রত্যাশা ক্রস ব্রাউজার সমর্থন সেই ক্ষেত্রে একটি চ্যালেঞ্জ হিসাবে প্রমাণিত হতে পারে, যদিও আমি ভুল হতে পারি।

যে কেউ হাতের জিনিসগুলির মধ্যে পার্থক্যটি পরিষ্কার করতে পারে? যদি গতির পার্থক্য থাকে তবে তা তুচ্ছ না হলেও আমিও তা জানতে চাই। যদি আমি এই সমস্ত ভুল দেখতে পাই তবে আমাকে বিনা দ্বিধায় শিক্ষিত করুন।


পিএস: দয়া করে, দয়া করে আমি জাভাস্ক্রিপ্ট পছন্দ করি, তাই হ্যাঁ, আমি এই ধরণের জিনিসটি মোকাবেলা করতে চাই। "JQuery আপনার সাথে এটি করে" এর মতো উত্তরগুলি আমি যা খুঁজছি তা নয়, তাই না ট্যাগ।


49
>> দয়া করে, দয়া করে, আমি জাভাস্ক্রিপ্ট পছন্দ করি, তাই হ্যাঁ, আমি এই ধরণের জিনিস নিয়ে কাজ করতে চাই। 'আপনার জন্য jQuery এর চুক্তি' এর মতো উত্তরগুলি আমি যা খুঁজছি তা নয় << এর জন্য
উর্ধ্বে

উত্তর:


211

মনে হচ্ছে আপনি এটিকে বোঝাচ্ছেন। আপনি childNodesএবং এর মধ্যে পার্থক্যটি পর্যবেক্ষণ করেছেন children, যা childNodesপুরো সাদা অংশের অন্তর্ভুক্ত টেক্সট নোড সহ সমস্ত নোড ধারণ করে, যখন childrenকেবলমাত্র শিশু নোডের উপাদান যা উপাদান। সত্যিই এটি আছে।

উভয়ই সংগ্রহ সম্পর্কে অপ্রত্যাশিত কিছু নেই, যদিও সচেতন হতে বেশ কয়েকটি বিষয় রয়েছে:

  • IE <= 8 childNodesঅন্যান্য ব্রাউজারগুলি করার সময় কেবল সাদা স্থান-কেবল পাঠ্য নোডগুলিকে অন্তর্ভুক্ত করে না
  • IE <= 8 এর মধ্যে মন্তব্য নোড অন্তর্ভুক্ত রয়েছে childrenযখন অন্য ব্রাউজারগুলিতে কেবল উপাদান থাকে

children, firstElementChildএবং বন্ধুরা কেবল সুবিধাজনক, কেবলমাত্র উপাদানগুলিতে সীমাবদ্ধ DOM এর একটি ফিল্টার দর্শন উপস্থাপন করে।


ততটুকু চিত্রিত হয়েছে, যদিও একটি জিনিস এখনও আমাকে বাগ করেছে: চাইল্ডনডস যে সাদা বাক্সটির পাঠ্যকোডটি তুলেছে তা হ'ল কোডটিতে একটি নতুন লাইন এবং কয়েকটি ট্যাব। এটি কি এক্সএইচটিএমএল ডক্টাইপের কারণে? এই ট্যাগগুলির মধ্যে স্ট্রাক্ট কোডটিতে শ্বেত স্থানটি বন্ধ করে সমাধান করা যেতে পারে?
এলিয়াস ভ্যান ওটেজেম

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

আমি বোঝাতে চাইছি যদি এটি আমার মার্কআপটি এভাবে লিখতে সহায়তা করে <td\n\t>content</td>। আপনি এক্সএমএল হিসাবে যেমনটি করতে পারেন, অতিরিক্ত শ্বেত স্থানটিকে ডেটা (বা এই ক্ষেত্রে ডিওএম) হিসাবে বিবেচনা করা থেকে বাঁচতে পারেন। কেন কোনও ট্যাগের অভ্যন্তরে সাদা স্থানটি ডিওমে অন্তর্ভুক্ত হবে?
এলিয়াস ভ্যান ওটেজেম

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

2
@ ক্রিস্টোফ: আহ, ফর্সা পয়েন্ট, ধন্যবাদ। আমি আমার উত্তরে একটি নোট যুক্ত করব। childrenএকটি স্ট্যান্ডার্ড হওয়ার আগে বা অন্য ব্রাউজারগুলি গ্রহণ করার আগে এক দশকেরও বেশি সময় আইই 4 তে উত্পন্ন যেটি দেওয়া হয়েছে , আপনি যুক্তি দিতে পারেন যে আই <= 8 সঠিক এবং অন্যান্য ব্রাউজারগুলি ভুল।
টিম ডাউন

23

প্রথম এলিমেন্টচিল্ড আইই <9 তে উপলব্ধ নাও হতে পারে (কেবলমাত্র প্রথম ফার্স্ট শিশু)

IE <9 এ ফার্স্টচিল্ডটি ফার্স্ট এলিমেন্টচিল্ড কারণ এমএস ডোম (আইই <9) খালি পাঠ্য নোডগুলি সঞ্চয় করছে না। তবে আপনি যদি অন্য ব্রাউজারগুলিতে এটি করেন তবে তারা খালি পাঠ্য নোডগুলি ফিরিয়ে দেবে ...

আমার সমাধান

child=(elem.firstElementChild||elem.firstChild)

এটি প্রথম <আই> 9 তে প্রথম সন্তান প্রদান করবে


যদি elem.firstChildকোনও এলিমেন্ট নোড না হয় তবে পুরানো আইইগুলিতে ফলাফলগুলি ভিন্ন হবে, কারণ elem.firstElementChildসর্বদা উপাদান নোড।
দুরী

আমি দুঃখিত, তবে আমি জানি যে সমস্ত বড় ব্রাউজারে প্রথম সন্তান কীভাবে পাওয়া যায়। আমি যেটি জানতে চাই তা হ'ল বিভিন্ন বস্তুগুলি কীভাবে কাঠামোগত হয়, যাতে তাদের মধ্যে মিল ও পার্থক্য সম্পর্কে আরও ভাল ধারণা পাওয়া যায়। আমি আরও পরিষ্কার করার জন্য আমার প্রশ্নটি পরে সম্পাদনা করব, মিশ্রণের জন্য দুঃখিত
এলিয়াস ভ্যান ওটেজেম

1
firstElementChildঅ-আই ব্রাউজারগুলিতে অগত্যা নিরাপদ নয়: ফায়ারফক্স কেবল এটি 3.5 সংস্করণে সমর্থন করা শুরু করে।
টিম ডাউন

এটি ক্রোম, আই 9 এবং আই 8 এর জন্য কাজ করছে কারণ তাদের যদি ফার্স্টলেমেন্টচিল্ড থাকে তবে অন্য চেকটি কার্যকর করা হয় না, অন্যথায় (পুরানো আইই) আমাদের ফার্স্টচাইল্ড রয়েছে এবং এটি ব্রাউজারের জন্য একটি উপাদান নোড যা ফার্স্ট এলিমেন্টচিল্ড নেই (আই <9) ) ... এখনও আমি এফএফ সম্পর্কে অবাক হই
নিউ-রাহ

1
টিম যখন আমি বস্তু এইসব কাপড় googling ছিল সঠিক এই আপ দেখিয়েছেন, ভাল সাইট একটি সময় একবার চেক করতে
ইলিয়াস ভ্যান Ootegem

20

ক্রস ব্রাউজারের উপায়টি হ'ল ব্যবহার childNodesকরা NodeList, তারপরে nodeType ELEMENT_NODE দিয়ে সমস্ত নোডের একটি অ্যারে তৈরি করুন ।

/**
 * Return direct children elements.
 *
 * @param {HTMLElement}
 * @return {Array}
 */
function elementChildren (element) {
    var childNodes = element.childNodes,
        children = [],
        i = childNodes.length;

    while (i--) {
        if (childNodes[i].nodeType == 1) {
            children.unshift(childNodes[i]);
        }
    }

    return children;
}

http://jsfiddle.net/s4kxnahu/

আপনি লড্যাশের মতো কোনও ইউটিলিটি লাইব্রেরি ব্যবহার করছেন তবে এটি বিশেষত সহজ :

/**
 * Return direct children elements.
 *
 * @param {HTMLElement}
 * @return {Array}
 */
function elementChildren (element) {
    return _.where(element.childNodes, {nodeType: 1});
}

ভবিষ্যত:

আপনি ছদ্ম-শ্রেণীর querySelectorAllসাথে সংমিশ্রণে ব্যবহার করতে পারেন :scope(নির্বাচকটির রেফারেন্স পয়েন্টের উপাদানটির সাথে মেলে):

parentElement.querySelectorAll(':scope > *');

এটি লেখার সময় ক্রোম, ফায়ারফক্স এবং সাফারিতে :scopeসমর্থিত


: স্কপ থেকে সুযোগ সরানো হয়েছে । আমাদের ভবিষ্যত বিভাগটি সরিয়ে নেওয়া উচিত ?
টমাস মার্তি

4

কেবলমাত্র অন্য উত্তরগুলি যুক্ত করতে এখানে এখনও উল্লেখযোগ্য পার্থক্য রয়েছে, বিশেষত <svg>উপাদানগুলির সাথে কাজ করার সময় ।

আমি উভয় ব্যবহার করেছেন .childNodesএবং .childrenএবং সঙ্গে কাজ অগ্রাধিকার দিয়েছেন HTMLCollectionদ্বারা বিতরণ .childrenসংগ্রহকারী।

আজ অবশ্য আমি আই ই / এজ সমস্যা যখন ব্যবহার ব্যর্থ গাড়ীতে আঘাত .childrenএকটি অন <svg>। যদিও .childrenবেসিক এইচটিএমএল উপাদানগুলিতে আইই সমর্থিত হয়, এটি নথি / নথির টুকরো বা এসভিজি উপাদানগুলিতে সমর্থিত নয়

আমার জন্য, আমি কেবল প্রয়োজনীয় উপাদানগুলি দখল করতে সক্ষম .childNodes[n]হয়েছি কারণ আমার উদ্বেগের জন্য বহিরাগত পাঠ্য নোড নেই। আপনি একই কাজ করতে সক্ষম হতে পারেন, তবে উপরে অন্য কোথাও উল্লিখিত হিসাবে ভুলবেন না যে আপনি অপ্রত্যাশিত উপাদানগুলির মধ্যে চলে যেতে পারেন।

আশা করি যে কেউ .childrenআধুনিক আইই তে তাদের জেএসে অন্য কোথাও কাজ করে এবং ডকুমেন্ট বা এসভিজি উপাদানগুলিতে ব্যর্থ হয় তা বোঝার চেষ্টা করে এমন কেউ তাদের মাথা আঁচড়ানোর পক্ষে সহায়ক ।


3

আরে ছেলেরা সাদা স্থান আপনাকে বোকা বানাতে দেবে না। এটি একটি কনসোল ব্রাউজারে পরীক্ষা করুন। নেটিভ জাভাস্ক্রিপ্ট ব্যবহার করুন। এখানে একই শ্রেণীর সাথে দুটি 'উল' সেট সহ উদাহরণ রয়েছে। সাদা স্থান এড়াতে আপনার 'উল' তালিকাটি সমস্ত এক লাইনে রাখতে হবে না কেবল সাদা জায়গার উপরে ঝাঁপ দেওয়ার জন্য আপনার অ্যারে গণনাটি ব্যবহার করুন।

কিভাবে প্রায় সাদা স্থান পেতে সঙ্গে querySelector()তারপর childNodes[]বেহালার লিংক JS: https://jsfiddle.net/aparadise/56njekdo/

var y = document.querySelector('.list');
var myNode = y.childNodes[11].style.backgroundColor='red';

<ul class="list">
    <li>8</li>
    <li>9</li>
    <li>100</li>
</ul>

<ul class="list">
    <li>ABC</li>
    <li>DEF</li>
    <li>XYZ</li>
</ul>

আমার ডাউন-ভোট নয়, তবে আমি মনে করি যে কেউ কাউকে নিচে ভোট দিয়েছেন কারণ: ক) এই প্রশ্নটি 4 বছরের পুরানো, document.querySelectorতখন ভালভাবে সমর্থন করা হয়নি। খ) প্রশ্নটি মূলত জিজ্ঞাসা করছে যে অভ্যন্তরীণভাবেchildren এবং childNodes অভ্যন্তরীণ মধ্যে কোন পার্থক্য রয়েছে , যা আরও নির্ভরযোগ্য, কখন অন্যের থেকে একটি বেছে নেবেন। এবং গ) কারণ, প্রশ্নে demonstraded হিসাবে: childNodes নেই অন্তর্ভুক্ত হোয়াইটস্পেস নোড, childrenনা ...
ইলিয়াস ভ্যান Ootegem
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.