شیء HTMLCollection
یک لیست آرایه مانند از تمام عناصر HTML است و در واقع هنگامی که در کدهایمان از دستور ()getElementsByTagName
استفاده می کنیم یک شیء HTMLCollection
به ما برگردانده می شود. بگذارید با یک مثال ببینیم.
کد زیر تمام عناصر <p>
را به ما برمیگرداند:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM</h2> <p>Hello World!</p> <p>Hello Iran!</p> <p id="demo"></p> <script> var myCollection = document.getElementsByTagName("p"); document.getElementById("demo").innerHTML = "The innerHTML of the second paragraph is: " + myCollection[1].innerHTML; </script> </body> </html>
دلیل انتخاب Iran این است که ایندکس آرایه ها از صفر شروع می شود بنابراین ایندکس 1 مساوی است با مورد دوم.
همچنین ما می توانیم از خاصیت length
استفاده کنیم تا بدانیم در HTMLCollection
چند شیء وجود دارد. در مثال زیر می خواهیم همین کار را انجام دهیم:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM</h2> <p>Hello World!</p> <p>Hello Iran!</p> <p id="demo"></p> <script> var myCollection = document.getElementsByTagName("p"); document.getElementById("demo").innerHTML = "This document contains " + myCollection.length + " paragraphs."; </script> </body> </html>
می بینید که عدد 3 به ما برگردانده شده است. در این کد ابتدا گفته ایم یک مجموعه از عناصر <p>
را بساز. سپس از جاوا اسکریپت خواسته ایم که تعداد اعضای این مجموعه را به ما برگرداند که همان عدد 3 است. اگر تعداد پاراگراف ها را اضافه کنیم:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM</h2> <p>Hello World!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p>Hello Iran!</p> <p id="demo"></p> <script> var myCollection = document.getElementsByTagName("p"); document.getElementById("demo").innerHTML = "This document contains " + myCollection.length + " paragraphs."; </script> </body> </html>
میبینید که در خروجی عبارت This document contains 10 paragraphs به معنی «این سند 10 پاراگراف دارد» نمایش داده می شود.
سوال: فایده ی خاصیت length
جیست و به چه دردی می خورد؟
پاسخ: خاصیت length
معمولا زمانی که بخواهیم توسط حلقه ها بین اعضای یک مجموعه عنصر گردش کنیم بسیار مفید و کاربردی است. مثال:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM</h2> <p>Hello World!</p> <p>Hello Iran!</p> <p>Click the button to change the color of all p elements.</p> <button onclick="myFunction()">Try it</button> <script> function myFunction() { var myCollection = document.getElementsByTagName("p"); var i; for (i = 0; i < myCollection.length; i++) { myCollection[i].style.color = "red"; } } </script> </body> </html>
به این کد گفته ایم تک تک اعضای شیء ما را پیدا کن و به آن ها style.color به رنگ قرمز بده! به این نحو تمامی عناصر صفحه قرمز می شوند.
هشدار: HTMLCollection شیء است نه آرایه! شباهت بیش از حد آن به آرایه ها (گردش در آن توسط حلقه ها و ...) باعث می شود خیلی ها فکر کنند که یک آرایه است اما HTMLCollection در حقیقت شیء است. به طور مثال شما نمی توانید از توابع مربوط به آرایه ها مانند ()valueOf و ()pop و ()push و ()join استفاده کنید.
شیء NodeList
در حقیقت یک لیست از Node ها است که از یک سند گرفته شده است. بنابراین شیء NodeList
تقریبا مشابه شیء HTMLCollection
است. برخی از مرورگرهای قدیمی به جای برگرداندن شیء HTMLCollection
در هنگام استفاده از ()getElementsByClassName
شیء NodeList
را بر می گردانند.
البته تمام مرورگر ها برای خصوصیت childNodes
یک NodeList
برمیگردانند. همچنین اکثر مرورگر ها برای دستور ()querySelectorAll
باز هم یک NodeList
برمیگردانند. بر اساس چیزی که گفتیم می توانیم بفهمیم که کد زیر تمام node های <p>
را انتخاب می کند:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM!</h2> <p>Hello World!</p> <p>Hello Iran!</p> <p id="demo"></p> <script> var myNodelist = document.querySelectorAll("p"); document.getElementById("demo").innerHTML = "The innerHTML of the second paragraph is: " + myNodelist[1].innerHTML; </script> </body> </html>
حتما توجه دارید که ایندکس ها از صفر شروع می شوند! با دانستن این نکته می توانیم مانند آرایه ها از طریق ایندکس به این شیء دسترسی داشته باشیم. حالا می توانیم از خاصیت length
برای این شیء نیز استفاده کنیم تا تعداد node های یک لیست یا شیء را برایمان برگرداند:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM!</h2> <p>Hellow World!</p> <p>Hellow Iran!</p> <p id="demo"></p> <script> var myNodelist = document.querySelectorAll("p"); document.getElementById("demo").innerHTML = "This document contains " + myNodelist.length + " paragraphs."; </script> </body> </html>
در این مثال ابتدا با استفاده از دستور querySelectorAll تمام عناصر <p> را می گیریم. سپس آن ها را با استفاده از خاصیت length اندازه گیری می کنیم. استفاده ی عملی از آن نیز دقیقا هنگام گردش در آیتم های مختلف NodeList
توسط حلقه ها است:
<!DOCTYPE html> <html> <body> <h2>JavaScript HTML DOM!</h2> <p>Hello World!</p> <p>Hello Iran!</p> <p>Click the button to change the color of all p elements.</p> <button onclick="myFunction()">Try it</button> <script> function myFunction() { var myNodelist = document.querySelectorAll("p"); var i; for (i = 0; i < myNodelist.length; i++) { myNodelist[i].style.color = "red"; } } </script> </body> </html>
طبق تعریفی که به شما ارائه دادیم، شیء HTMLCollection
حاوی مجموعه ای از عناصر HTML است و شیء NodeList
نیز حاوی node های سند HTML. این دو در واقع یکی هستند و هر دو لیستی آرایه مانند از اشیاء هستند. هر دو آن ها خاصیت length را دارند که نشان دهنده ی تعداد اعضای این لیست ها است و هر دو ایندکس دارند. اعضای HTMLCollection از طریق نامشان، id شان و شماره ایندکس شان قابل دسترسی هستند اما اعضای NodeList ها تنها از طریق شماره ایندکس شان قابل دسترسی هستند.
امیدوارم از این قسمت لذت برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.