جاوا اسکریپت به زبان ساده: انتخاب المانهای HTML
تمامی صفحات وب از کدهای اچتیامال تشکیل شدهاند. با کمک CSS و استایلهای آن، این کدها ظاهر مرتبتر و زیباتری به خود میگیرند. جاوا اسکریپت نیز به شما کمک میکند این المانهای زیبا را تغییر دهید. مثلا محتوای اچتیامالها را تغییر دهید، آن را حذف کنید یا متنی به آن اضافه کنید و …! در این جلسه با نحوه انتخاب المانهای اچتیامال آشنا خواهیم شد. با ما همراه شوید.
چگونه یک المان اچتیامال را با کمک جاواسکریپت انتخاب کنیم؟
اگر با زبان سیاساس آشنا باشید، میدانید که بهصورت کلی چند روش برای انتخاب المانها وجود دارد! انتخاب بر اساس id، انتخاب بر اساس نام class یا انتخاب بر اساس نوع تگ (مثلا کل تگهای p یا h2 صفحه).
در جاوا اسکریپت نیز همین قانون برقرار است. یعنی شما میتوانید المانهای صفحه را بر اساس نام id، نام کلاس (Class) یا نوع تگ انتخاب کنید. در تمامی این حالت ما از آبجکتی به نام document کمک میگیریم! آبجکت داکیمونت را مانند یک ظرف خیلی بزرگ در نظر بگیرید که کل اطلاعات صفحه در آن ذخیره شده است. پس وقتی میخواهیم به صفحه اچتیامال در جاوا اسکریپت دسترسی داشته باشیم، میرویم و داخل این جعبه document را نگاه میکنیم و با جستجو در آن المان مورد نظرمان را انتخاب (select) میکنیم. برای انتخاب المانهای اچتیامال از جعبه document روشهای زیر را یاد خواهیم گرفت:
انتخاب المان بر اساس ID:
در این حالت فرض میکنیم که المانهای اچتیامال ما دارای id منحصربهفردی هستند که به کمک آن میتوانیم المان را شناسایی و توسط جاوا اسکریپت انتخاب و در صورت تمایل تغییرات مورد نیازمان را اعمال کنیم.
دستور کلی جاوااسکریپت برای انتخاب المان بر اساس شناسه یا آیدی بهصورت زیر است:
این کار توسط دستور ()getElementById
انجام میشود. در این دستور (یا همان متد خودمان) ما یک پرانتز داریم که داخل این پرانتز باید دو تا “”
بگذاریم. سپس داخل این کوتیشنها نام آیدی المان تعریفشده در اچتیامال را قرار میدهیم.
مثلا یک المان با ID دمو داریم:
<div id=”select-by-id” > این دیویژن قرار است توسط جاوا اسکریپت انتخاب شود </div>
حالا میخواهیم آن را توسط جاوا اسکریپت انتخاب کنیم.
document.getElementById(‘select-by-id’);
در این مثال ما المان HTML با آیدی select-by-id را انتخاب کردهایم و میتوانیم روی آن تغییر ایجاد کنیم.
انتخاب بر اساس نام تگ:
گاهی میخواهیم تمامی تگهای اچتیامال را بهصورت یکجا انتخاب کنیم! مثلا میخواهیم هر چه تگ P یا H1 در صفحه است، یکجا انتخاب کنیم و یکجا آنها را تغییر دهیم. در این حالت جاوااسکریپت روش مخصوص خودش را به ما میدهد. این روش که با نام selectByTagName شناخته میشود. دستور نوشتن انتخاب بر اساس نام تگ نیز به شکل زیر است:
document.getElementsByTagName(“p”)
در این مثال ما کل المانهای پاراگراف را که با تگ p در صفحه شناخته میشوند، انتخاب کردهایم. دقت کنید که در اینجا ما مجموعهای از المنتها را با هم انتخاب میکنیم، پس در دستور خود کلمه Elements را بهجای Element در دستور قبلی مینویسیم.
انتخاب المان بر اساس نام کلاس:
getElementsByClassName()
گاهی میخواهیم همه المانهایی را که دارای یک کلاس مشخص هستند، انتخاب کنیم. در این حالت میتوانیم از دستور document.getElementsByClassName
استفاده کنیم و نام کلاس را همراه با “”
درون پرانتز بگذاریم.
var list = document.getElementsByClassName(‘list’);
در این حالت هم نتیجه انتخاب ما یک مجموعه از المنتهای اچتیامال خواهد بود. برای تغییر روی چنین مجموعهای که بدان آرایه میگوییم، باید روشهای کار با آرایههایی مثل استفاده از حلقه را یاد بگیریم. به همین خاطر در این جلسه اعمال تغییرات روی اچتیامال را تنها محدود به حالت getElementById میکنیم و مباحث بیشتر در مورد این موضوع را به جلسات آینده موکول خواهیم کرد.
ذخیره المان اچتیامال در متغیر
اگر بخواهیم حرفهایتر برخورد کنیم، بهتر است المان انتخابشده را در داخل یک متغیر بریزیم. بدین ترتیب هر وقت نام آن متغیر را بنویسیم به تمامی محتوای آن دسترسی داریم و میتوانیم روی آن هر تغییری که دوست داریم اعمال کنیم.
var el = document.getElementById(‘malek’);
بعد از انتخاب توسط جاوا اسکریپت، چه تغییراتی میتوان روی اچتیامال انجام داد؟
حالا فرض کنیم که یک المان را توسط جاوا اسکریپت انتخاب کنیم! این کار به چه دردمان میخورد؟ آن وقت میتوانید تمامی تغییراتی که جاوا اسکریپت به شما اجازه میدهد روی آن المان انجام دهید. در واقع با انتخاب یک المان توسط جاوا اسکریپت، یک آبجکت (همانند یک ظرف کوچک دیگر در نظر بگیرید) از آن المنت خواهید داشت که در درون این آبجکت قابلیتهای وجودی دارد (مثل محتوای داخل جعبه)! مثلا میتوانید اچتیامال این المان را تغییر دهید (محتوای داخل جعبه را انتخاب و تغییر دهید) میتوانید آن را حذف کنید. بدان تگ جدیدی اضافه کنید! یک کلاس سیاساس جدید بدان اضافه کنید و …
در ادامه لیست تغییراتی را که بهطور کلی روی المانهای اچتیامال بعد از انتخاب توسط جاوا اسکریپت انجام میدهیم، مرور میکنیم:
تغییر در متن:
فرض کنید میخواهید متن یک تگ p را بعد از کلیک روی یک دکمه تغییر دهید. نه سیاساس نه اچتیامال هیچکدام امکان تغییر در متن را بعد از رندر شدن توسط مرورگر نمیدهند؛ ولی جاوا اسکریپت این امکان را در اختیار شما قرار میدهد. برای تغییر متن از دستور innerHTML بعد از نام المان استفاده میشود.
document.getElementById(id).innerHTML = محتوای جدید
در زیر مرحله به مرحله این کار را انجام دادهایم:
مرحله اول: انتخاب المان HTML در صفحه
با توجه به نکاتی که بالاتر گفتیم میتوانیم یک المان اچتیامال را بر اساس id یا class یا تگ آن انتخاب کنیم. برای مثال برای تغییر محتوای متن المان p با نام malek مراحل زیر را طی میکنیم:
فایل html
<p id=”malek”>من را تغییر بده!</p>
فایل جاوا اسکریپت
document.getElementById(‘malek’)
در این مرحله ما در واقع از آن المان اچتیامال که انتخاب کردهایم یک آبجکت میسازیم. آبجکت را در جلسات بعدی مفصلتر صحبت خواهیم کرد؛ ولی برای درک بهتر، آبجکت اچتیامال را مانند ظرفی در نظر بگیرید که درون آن دستورات و روشهای مختلفی برای تغییر المان ذخیره شده است! برای دسترسی به این دستورات، کافی است نام دستور مورد نظرمان را در کنار نام آبجکت بنویسیم و یک علامت .
بگذاریم!
نکته مهم: میتوانیم المان اچتیامال را بعد از انتخاب در یک متغیر ذخیره کنیم. این کار چه فایدهای دارد؟ مهمترین فایده آن است که اگر بخواهیم بعدا تغییر دیگری روی این المان اعمال کنیم مجبور نیستیم باز هم دستور document.getElementById(‘malek’) را بنویسیم و این کارها را تکرار کنیم! چون تمامی اطلاعات المان در یک متغیر ذخیره شده و کافی است نام متغیر را به همراه دستور دلخواه کنار آن بنویسیم!
برای مثال محتوای المان اچتیامال با id با نام malek را در یک متغیر به نام elem ذخیره میکنیم:
var elem = document.getElementById(‘malek’)
مرحله دوم: انجام تغییرات مورد نظر توسط جاوا اسکریپت
بعد از انتخاب المان توسط جاوا اسکریپت وقت آن رسیده است تا روی آن تغییرات ایجاد کنیم. گفتیم که هر المان در جاوا اسکریپت بهصورت یک آبجکت (ظرفی که محتوای آن دستورات جاوا اسکریپتی و اطلاعات مربوط به المان) ذخیره میشود. برای اعمال تغییر روی این المان اچتیامال دستور دلخواه را مینویسیم. مثلا برای تغییر محتوا از دستور innerHTML استفاده میکنیم:
document.getElementById(‘malek’).innerHTML = “من تغییر کردهام”
مثالهای دیگر:
مثال اول:
<button id=”my-button”>متن دکمه تغییر کند</button>
document.getElementById(“my-button”).innerHTML = “تغییر متن دکمه”
مثال دوم: در این مثال میخواهیم کمی متفاوت عمل کنیم! مثلا محتوای ذخیرهشده در یک متغیر را روی یک المان بنویسیم.
<span id=”change-me”>من را تغییر بدهید!</span>
var content = ” متن جدید ما”
document.getElementById(“change-me”).innerHTML = content
همانطور که دیدید، یک استرینگ را که در یک متغیر ذخیره شده است، بهعنوان متن جدید به تگ span با آیدی change-me دادهایم.
مثال سوم:
در این مثال قصد داریم کمی خلاقانهتر از این موضوع استفاده کنیم. در جاوا اسکریپت دستوری به نام prompt وجود دارد. این دستور یک پنجره مشابه الرت باز میکند؛ با این تفاوت که کاربر میتواند در این پنجره متن هم تایپ کند.
برای ساخت یک پنجره prompt، یک متغیر با نام دلخواه میسازیم و دستور window.prompt را به عنوان مقدار به آن میدهیم. در نتیجه این متغیر یک پنجره propmt ٰرا در مرورگر باز میکند.
<p id=”user-age”>سن شما </p>
var age = prompt(“سن خود را وارد کنید”);
if (age != null) {
document.getElementById(“user-age”).innerHTML =
“شما ” + age + “ساله هستید”;
}
همچنین دقت کنید دستور innerHTML تنها متن را تغییر نمیدهد! در واقع تمامی HTML را که داخل آن تگ وجود دارد تغییر میدهد. برای مثال اگر المان اچتیامال شما دارای بچههای دیگری مثل تگهای پاراگراف یا span یا هر چیز دیگری باشد، بعد از این کار حذف و محتوای جدید جایگزین آن میشود!
نکته بعدی آن است که شما میتوانید یک اچتیامال جدید را به جای استرینگ بنویسید. مثلا:
document.getElementById(“user-age”).innerHTML = ‘<span>سلام!</span> <span id=”inner-span”> یک المان داخلی</span>’
تغییر attribute-های اچتیامال:
یکی دیگر از مواردی که میتوانید روی المانهای اچتیامال انجام دهید، تغییر attribute-های آنها است. برای این کار کافی است نام attribute را بعد از المان اچتیامال بنویسید و مقدار جدید را بدان اختصاص دهید.
document.getElementById(id).attribute = مقدار جدید
مثال: برای مثال در زیر میخواهیم اتریبیوت src در تصویر دارای ID با نام change-me را تغییر دهیم! برای این کار بهراحتی دستور زیر مینویسیم:
document.getElementById(“change-me”).src = “new-image.jpg”;
در مثال بعدی میخواهیم مقدار یک اینپوت متنی در اچتیامال را در صفحه چاپ کنیم! برای این کار ابتدا باید مقدار اینپوت را توسط جاوا اسکریپت ذخیره کنیم:
HTML
<input type=”text” id=”text-input” value=”یک متن در داخل اینپوت” >
<p id=”text-content”>متن اینپوت</p>
var inputText = document.getElementById(“my-text”).value;
document.getElementById(“text-content”).innerHTML = inputText;
مثال سوم: در سومین مثال میخواهیم یک دکمه را به کمک جاوا اسکریپت Disable کنیم. این کار نیز بهسادگی هر چه تمامتر قابل اجرا است:
HTML
<button id=”activate-me” disabled>دکمه فعال</button>
<button id=”deactivate-me”> دکمه غیر فعال </button>
فایل JS
document.getElementById(“activate-me”).disabled = false;
document.getElementById(“deactivate-me”).disabled = true;
با تغییر اتریبیوت disabled در تگ Button و true یا false کردن آن میتوانیم دکمهها را فعال یا غیر فعال کنیم.
نکته پایانی:
همانطور که گفتیم هر اتریبیوتی در هر المان اچتیامالی قابل دسترسی است. کافی است نام آن اتریبیوت را بنویسید تا مقدار آن را بگیرید. مثلا برای دریافت نام یک فرم:
<form name=”zarrinhoor” id=”custom-form”>
</form>
document.getElementById(“custom-form”).name
از این دست مثالها بینهایت وجود دارد. کافی است خودتان دست به کار شوید و اتریبیوت تگهای مختلف را امتحان کنید.
استفاده از HTML5 Data Attributes در جاوا اسکریپت:
یکی از قابلیتهای HTML 5 امکان اضافه کردن اتریبیوتهای جدید به تگهای HTML است. مثلا فرض کنید میخواهید به یک المان p علاوه بر اتربیوت id و class که بهصورت پیشفرض در همه المانهای p وجود دارند یک اتریبیوت دلخواه اضافه کنید که محتوای دلخواهتان را در خودش ذخیره میکند. مثلا میخواهیم همه المانهای p ما دارای یک متن پیشفرض باشند که در صورت خالی بودن متنشان، این متن در آنها نمایش داده شود.
برای این کار یک راه حل این است که یک اتریبیوت Data به اچتیامال تگمان اضافه کنیم. قاعده کلی اضافه کردن اتریبیوت به اچتیامال بهصورت زیر است:
<element data-atttibuteName=”value”> محتوای المنت</element>
بدین ترتیب که همیشه کلمه data-
و بعد از آن، نام اتریبیوت دلخواهمان را مینویسیم. مثلا
<p id=”mh-malek” class=”zarrinhoor-text” data-customer=”1245″> تگ با اتریبیوت دلخواه </p>
در این مثال ما یک تگ p با اتریبیوت دلخواه customer ساختهایم. اگر کلمه اتریبیوت ما چندبخشی باشد (مانند customer name) برای جدا کردن هر کلمه از علامت – استفاده میکنیم و نام هر اتریبیوت را مینویسیم. مثلا:
<p id=”mh-malek” class=”zarrinhoor-text” data-customer-name=”1245″>تگ با اتریبیوت دلخواه </p>
همچنین شما میتوانید بینهایت اتریبیوت دلخواه به المانهای اچتیامال خود اضافه کنید و هیچ محدودیتی در این زمینه برای شما اعمال نشده است. برای مثال:
<div id=”js-class” class=”zarrinhoor-class” data-custom-name=”mh-malek” data-custom-attr=”attrValue” >تگ با اتریبیوت دلخواه </div>
حالا وقتی بخواهیم مقدار این اتریبیوتها را در جاوا اسکریپت بگیریم، چه کار باید بکنیم؟ اینجا کمی کار ما دچار تغییر میشود! برای این کار مراحل زیر را طی میکنیم:
۱) انتخاب المان بر اساس id یا هر انتخابگر دیگری که یاد گرفتهایم:
<div id=”custom-element” class=”custom-class” data-single=”myName” data-custom-name=”mh-malek” data-custom-attr=”attrValue” >تگ با اتریبیوت دلخواه </div>
document.getElementById(“custom-element”)
همانطور که گفتیم میتوانیم هر المان اچتیامال را در یک متغیر ذخیره کنیم تا هر زمان خواستیم روی آن تغییر دهیم مجبور نباشیم کدها را از نو بنویسیم. بدین ترتیب کد بالا بهصورت زیر میشود:
var element = document.getElementById(“custom-element”);
مرحله دوم: برای دریافت مقدار custom attribute هایی که خودمان به تگ اچتیامال اضافه کردهایم از قاعده کلی زیر استفاده میکنیم:
elementName.dataset.attributeName
این بدین مفهوم است که ما تمامی اتریبیوتهای جدیدمان را در یک جا به نام dataset ذخیره داریم و از داخل این آبجکت میتوانیم هر یک را جداگانه داشته باشیم. برای مثال در المنت اچتیامال زیر خواهیم داشت:
<div id=”custom-element” class=”custom-class” data-single=”myName” data-custom-name=”mh-malek” data-custom-attr=”attrValue” >تگ با اتریبیوت دلخواه </div>
var element = document.getElementById(“custom-element”);
var firstDataAttribute = element.dataset.single ;
var secondDataAttribute = element.dataset.customName;
var thirdDataAttribute = element.dataset.customAttr;
همچنین به یاد داشته باشید در اتریبیوتهای چنداسمی بهجای علامت – حرف اول را بزرگ مینویسیم. مثلا data-custom-name میشود customerName
سخن پایانی:
در نهمین جلسه از آموزش جاوا اسکریپت با نحوه انتخاب المانهای اچتیامال صفحه آشنا شدیم. نکات نگفتهی بسیاری در رابطه با انتخاب و تغییر المانهای اچتیامال وجود دارد که سعی میکنیم در جلسات بعدی و بعد از یادگیری مباحث مربوط به array آنها را نیز بازگو کنیم.