HTML Element Node
هر سند html از ساختار های مختلفی تشکیل شده است. این ساختار به صورت درختی است و هر قسمت از این ساختار یک موجودیت خاص می باشد که خود می تواند موجودیت های متفاوتی را تشکیل دهد.
در ساختار بالا اصلی ترین موجودیت های متشکل از dom دو مورد HTML Element , Element Node می باشد.
HTML Element
یک موجودیت است که به صورت تگ در ساختار html می شناسیم که به آن HTML DOM Object نیز می گوییم. اگر بخواهیم لیست تمام Element ها را بررسی کنیم دقیقا مطابق با همان لیست تگ های html موجود. برای دریافت کردن لیست کامل HTML Collection از لیست کل تگ های موجود در ساختار html موجود از document.getElementsByTagName('*')
استفاده کنید.
برخی html element ها را بر اساس دسته بندی در زیر بررسی می کنیم :
- Main root : ریشه اصلی ساختار html یا همان تگ html
- Sectioning root : بدنه اصلی یا همان body
- Document metadata : تگ هایی حاوی اطلاعات که چیزی را سند نمایش نمی دهند تگ اصلی head شامل این دسته از تگ ها می شوند.این دسته تگ ها شامل استایل و اسکریپت و داده های مهم برای سایر نرم افزار ها مثل موتور های جستجو و یا مرورگر ها (Search Engine , Browsers) هستند.به طور مثال تگ های meta, style,script,link,title می باشند.
- Content sectioning : تگ هایی که برای تقسیم بندی کردن محتوای بدنه هستند. header , main , aside , footer , address , section , nav
- Text content : لیست تگ هایی که متن در آن ها قرار می گیرد. p , blockqoate , div , ul , ol , li و ساختار همگی display:block می باشند.
- Inline text semantics : تگ هایی با ساختار display: inline که شامل a,span,i,… می باشند.
- Multimedia : تگ هایی برای نمایش رسانه ها نظیر img, audio , video , …
- Embedded content : تگ هایی برای نمایش محتوای بلوک شده مثل iframe , source , …
- Form : تگ هایی برای کار با فرم ها در html
هر html element object یک سری ویژگی های انحصاری دارد و یک سری متد ها و ویژگی های عمومی که در کل این html element ها موجود است. به طور مثال تگ a زمانی که انتخاب می گردد یک سری ویژگی های انحصاری دارد مثل href , title , که در برخی تگ ها نیست و یک سری ویژگی عمومی (Global Attribute) مثل اندازه و وضعیت navigate ان مثل sibiling , parent , childrens که هر کدام قابل دسترسی هستند.
هر زمان خواستید که ویژگی های مورد نظر برای هر تگ را به صورت اختصاصی بررسی کنید ابتدا به صفحه اصلی لیست HTML Element reference بروید و تگ مورد نظر را جستجو کنید و در نهایت ویژگی های این تگ را بررسی کنید.
a (anchor element)
زمانی که یک HTML Element از نوع anchor element را دارید یک سری ویژگی های اختصاصی برای این تگ خواهیم داشت :
- href
- type
- hash : همان مقادیری است که در انتهای لینک با # نمایان می شوند و لینک را داخلی می کند.
- target
let anchorList = document.getElementsByTagName('a') undefined for(anchor of anchorList){ console.log(anchor.href,anchor.target,anchor.hash) }
img(image embeded element)
تگ تصویر هم علاوه بر شامل شدن ویژگی عمومی (Global Attribute) ویژگی های اختصاصی خود را نیز دارد .
- src
- width
- height
- sizes
- alt
let images = document.getElementByTagName('img') for(image of images){ console.log(image.align,image.width,image.height,image.alt) }
button
- disabled : برای غیر فعال کردن یک المان می باشد.
var pause = (button) => { button.disabled = true button.previousElementSibling.disabled = false clearInterval(window.interval); }
Global Attributes
لیست ویژگی ها و متد های عمومی هر HTML Element را بر اساس دسته بندی به قسمت های زیر تقسیم می کنیم. این ویژگی ها زمانی که یک HTML Element از هر نوع تگ داشته باشید در دسترس است . به طریقی فرض کنید که ویژگی ها و متد ها (Attributes , Methods) همان Interface است که تگ ها از روی این Interface شئ گرفته شده است.
HTML Element Dimension/Position
یک دسته از لیست ویژگی های موجود برای اندازه ها در html element است.
element.scrollWidth , element.scrollHeight | element width/height include padding |
element.clientHeight , element.clientWidth | element width/height include padding |
element.offsetWidth, element.offsetHeight | Returns the width/height of an element, including padding, border and scrollbar |
element.clientTop, element.clientLeft | border left , border top width |
element.scrollLeft,element.scrollTop | number of pixels an element’s content is scrolled horizontally/vertically |
element.offsetTop,element.offsetLeft | موقعیت یک المنت را نسبت به offsetParent به صورت افقی و عمودی (Top, Left) بر می گرداند. |
element.offsetParent | html element مورد نظر که offsetTop , offsetLeft را با توجه به آن تعیین می کرد را بر می گرداند . |
var image = document.getElementsByTagName('img')[1] image.offsetParent //<article class="col-md-8 single-main-content pull-md-left"> console.log(image.offsetTop,image.offsetLeft,image.offsetWidth)
HTML Element Navigating
هر المنت در ساختار درختی Dom یک موقعیت دارد و بنا به موقعیت خود می توان به المنت های اطراف خود دسترسی پیدا کنیم. این موقعیت در جهت های زیر قابل حرکت است:
- والد (Parent) که این جهت عمق دارد و می توان به صورت زنجیره ای به والد با عمق بالا تر دسترسی پیدا کرد.
- فرزندان (Children) این جهت رو به داخل در ساختار درختی می باشد و این جهت نیز عمق دارد.
- خواهر و برادر (Sibiling) این عمق در یک سطح از المنت است ، المان هایی با والد یکسان siblings هستند. و به صورت قبل (prev) و بعد (next) قابل تعریف است.
برای نشان کردن ¤ یک موجودیت در داخل درخت Dom با دو فرمت از موجودیت ها مواجه هستیم . Node و Element که برای هر کدام دسته متدهایی را در نظر گرفته ایم.
Element : در این نوع Navigate ما پس از پیمایش در هر جهت موجودیتی که بدست می آوریم از نوع Element است .
parentElement | element والد را بدست می آورد . اگر این متد را به صورت زنجیروار استفاده کنیم همان طور پدر و پدربزرگ و پدرجد را بدست می آوریم
document.getElementById("certain_list").parentElement //ul document.getElementById("certain_list").parentElement.parentElement //div#content |
closest() | در میان والد ها جستجو می کند تا element مورد نظر را با query selector داده شده به عنوان ورودی (با فرمت css selector) پیدا کند.
const element = document.getElementById("myElement"); const closest = element.closest(".container"); |
children | لیست element های فرزند را با فرمت HTML Collection بر می گرداند.
var list = document.querySelector('ul') list.children.length |
firstElementChild | اولین فرزند را در قالب element بر می گرداند |
lastElementChild | آخرین فرزند را در قالب element بر می گرداند. |
getElementsByTagName() | یافتن element بر اساس نام تگ از میان فرزندان . (جستجو در میان فرزندان بر اساس نام تگ) خروجی این ساختار یک HTML Collection است.
var list = document.getElementById('main_list') list.getElementsByTagName('li') در مثال بالا تنها li های فرزند لیست |
getElementsByClassName() | جستجو در میان فرزندان بر اساس نام کلاس
const list = document.getElementsByClassName("example")[0]; list.getElementsByClassName("child")[0].innerHTML = "Milk"; |
querySelector | برای پیدا کردن یک element بر اساس css selector به صورت HTML Element . تقریبا این حکم find را در jQuery دارد.
var menu = document.getElementById('main-menu') menu.querySelector('li') در مثال بالا اولین li یافت شده در عمق فرزندان المنت main-menu را برمی گرداند |
querySelectorAll | برای برگرداندان لیست HTML Collection یافت شده مبتنی بر css selector در عمق فرزندان elmenet در دسترس
var menu = document.getElementById('main-menu') menu.querySelectorAll('li') //HTML Collection در مثال بالا لیست li های فرزند لیست را بر می گرداند |
previousElementSibling |
let text = element.previousElementSibling.innerHTML; |
nextElementSibling |
element.nextElementSibling.innerHTML |
Node : در این دسته متد ها می توان به هر نوع node پیمایش کرد.حال ساختار element , text , …
parentNode |
let name = document.getElementById("myLI").parentNode.nodeName; |
childNodes |
const nodeList = document.body.childNodes; |
firstChild |
document.getElementById("myList").firstChild.innerHTML; |
lastChild |
document.getElementById("myList").lastChild.innerHTML; |
nextSibling |
document.getElementById("item1").nextSibling.innerHTML; |
previousSibling |
document.getElementById("item2").previousSibling.innerHTML; |
سایر متد های مهم و کاربردی مرتبط به Navigation در Element ها در قالب زیر تعریف می کنیم:
childElementCount | تعداد Element های فرزند را در یک سطح (همان فرزند) بر می گرداند .
let numb = document.getElementById("myDIV").childElementCount; |
contain | برای این که بفهمیم در عمق پایین تر از element در دسترس ما موجودیت مربوطه را داریم یا خیر. ورودی این متد یک HTML Element باید باشد. یعنی با داشتن دو element می توانیم بفهمیم وضعیت آن ها نسبت به هم در یک شاخه از درخت است یا خیر
var menu = document.getElementById('main-menu') menu.querySelector('li') |
Element Node
یک سری ویژگی برای دریافت مشخصات element جاری است که با node شروع می شود . همان طور که پیش تر اشاره کردیم element در دسته node قرار می گیرد.
nodeName | نام node را بر می گرداند در صورتی که تگ باشد نوع تگ. ویژگی tagName هم همین مقدار را بر می گرداند البته برای element ها
menu.nodeName //"UL" |
nodeType |
menu.nodeType //1 در این حالت اگر :
|
nodeValue | این ویژگی در صورتی مقدار بر می گرداند که موجودیت در دسترس آن node باشد .
li.querySelector('a').childNodes[0].nodeValue //Home li.querySelector('a').nodeValue //null در صورتی که خود node را برگردانیم نمی توانیم به عنوان یک رشته از آن استفاده کنیم. li.querySelector('a').childNodes[0] #text "Home" |
Manipulatie Elements
یک دسته از متد ها برای ویرایش element ها در ساختار درختی dom می باشد. عملیات های افزودن append , حذف remove هر المنت در جایگاه مورد نظر آن .
appendChild | افزودن یک node یا یک element به یک element دیگر
const node = document.createElement("li"); const textnode = document.createTextNode("Water"); node.appendChild(textnode); document.getElementById("myList").appendChild(node); |
insertBefore | دقیقا عملکردی مشابه appendChild دارد با این تفاوت که مکان اتصال قبل از element موجود است.
const newNode = document.createElement("li"); const textNode = document.createTextNode("Water"); newNode.appendChild(textNode); const list = document.getElementById("myList"); list.insertBefore(newNode, list.children[0]); |
replaceChild | جایگزین کردن node , element در عمق فرزندان یک element
var list = document.getElementsByTagName('ul')[0] var firstElement = list.firstElementChild var lastElement = list.lastElementChild list.replaceChild(firstElement,lastElement) یک مثال دیگر از جا به جا کردن یک لیست node const newNode = document.createTextNode("benz"); const element = document.getElementById("list").children[0]; element.replaceChild(newNode, element.childNodes[0]); |
removeChild | این متد به عنوان ورودی یک element از فرزند دریافت می کند و آن را از لیست فرزندان حذف می کند. این متد کم کاربرد است و اگر موجودیت را داشتیم با remove می توانیم آن را حذف کنیم.
const list = document.getElementById("myList"); list.removeChild(list.firstElementChild) |
remove | برای حذف یک element یا node کاربرد دارد.
var firstNode = firstElement.childNodes[0] firstNode.remove() |
innerTEXT | برای دریافت و یا مقداردهی محتوای یک element به صورت text
let element = document.getElementById('content') let text = element.innerText; یک مثال از مقدار دهی document.getElementById('content').innerTEXT = 'NEW CONTENT' |
innerHTML | برای دریافت و یا مقداردهی محتوای یک element به صورت HTML
let secondaryMenu = document.getElementById('secondary_menu') let mainMenu = document.getElementById('main_menu') mainMenu.innerHTML = secondaryMenu.innerHTML در مثال بالا جا به جا کردن محتوای دو منو اصلی و فرعی |
برای قرار دادن یک متن داخل یک element می توان هم از یک رشته استفاده کرد(innerHTML , innerTEXT) و هم از یک element دیگر که می تواند شاخه ای از یک درخت dom باشد استفاده کرد(تمامی متد های بالا) و هم می توان از TextNode استفاده کرد.
var header = document.querySelector('#header') //1.using innerHTML,innerTEXT header.innerHTML = '<h1>HEADER</h1>' header.innerTEXT = 'HEADER' //2.using TextNode var headerText = document.createTextNode('HEADER') header.appendChild(headerText) //3.using Element HTML var headerElement = document.createElement('h1') headerElement.innerTEXT = 'HEADER' header.appendChild(headerElement)
Element Attribute
یکی دیگر از موجودیت های مرتبط با dom ویژگی ها Attribute Node هستند . این attribute به اشیا element متصل می شوند. اگر یک element object را در نظر بگیرید یک سری از ویژگی های آن ها attribute های آن ها هستند. attribute ها در element به صورت name="value
” تعریف می شوند.
ویژگی ها شامل event , class , id , data , … می باشند.
getAttribute | دریافت کردن مقدار یک attribute به وسیله کلید آن
let text = element.getAttribute("class") |
setAttribute | برای ست کردن یک attribute این روش ساده تر از متد setAttributeNode می باشد.
element.setAttribute("class", "democlass"); |
removeAttribute |
anchorElement.removeAttribute("href");
|
hasAttribute | برای این که چک کند آیا یک element ویژگی داده شده در پارامتر را دارد یا خیر (خروجی true, false )
myButton.hasAttribute("onclick");
|
یک دسته دیگر از متد ها برای عملیات های set,get,remove,has برای attribute در فرمت Attribute Node می باشد.
getAttributeNode | برای دریافت کردن attribute خواسته شده در قالب پارامتر name با فرمت Attribute Node
element.getAttributeNode("class") خروجی متد بالا یک Attribute Node object است که خود مقادیر name , value دارد . این ساختمان داده به صورت جمع در قالب NamedNodeMap می باشد . var bodyClass = document.body.getAttributeNode('class') bodyClass.name "class" bodyClass.value "activity-stream" |
setAttributeNode | برای اتصال یک attribute node به یک element
const class = document.createAttribute("class"); class.value = "display-inline"; const h1 = document.getElementsByTagName("H1")[0]; h1.setAttributeNode(class); |
removeAttributeNode | دقیقا با همان ساختار removeAttribute است منتها به عنوان ورودی Attribute Node دریافت می کند.عکس مثال بالا
const class = document.getAttributeNode("class"); const h1 = document.getElementsByTagName("H1")[0]; h1.removeAttributeNode(class); در این نوع عملکرد قرار است ابتدا Attribute Node را از element دریافت کنیم و با استفاده از آن از element حذف کنیم. |
برای بدست آوردن لیست کلاس ها و شناسه element نیز ویژگی های مفیدی داریم :
className | برای ست کردن یک رشته کلاس به یک element است با استفاده از این ویژگی می توان چندین کلاس را در قالب یک رشته برای element ست کرد.
document.getElementById("main_div").className = "row d-flex" |
classList | برگرداندن کلاس های موجود در element در فرمت ساختمان داده DOMTokenList است
var classList = document.getElementById("main_div").classList با استفاده از این ساختمان داده کاربردی می توان چک کرد که آیا کلاس موجود است (contain) یا یک کلاس اضافه کرد (add) یا حذف (remove) یا کلاس را toggle کرد. |
id | شناسه element را برمی گرداند و می توان شناسه element را برای آن ست کرد – Sets or returns the value of the id attribute
let id = document.getElementsByTagName("a")[0].id document.getElementById("demo").id = "newid" |
Event Attribute
برای ست کردن و حذف یک Event به یک element است . تکنیک های استفاده از Event را در یک مقاله مجزا بررسی خواهیم کرد.
addEventListener | برای ثبت یک واقعه برای یک element است . این تابع دو پارامتر دریافت می کند . اول نوع واقعه و دوم تابع مدیریت این وقوع. عملکرد این دسته از متد ها مثل قلاب ها (hooks) در برنامه نویسی کار می کند.
//type one element.addEventListener("click", myFunction); function myFunction() { document.getElementById("demo").innerHTML = "Hello World"; } //type tow element.addEventListener("click", function(event) { document.getElementById("demo").innerHTML = "Hello World"; }); //type three element.addEventListener("click", alert('it work')); |
removeEventListener | برای حذف یک تابع handler از یک واقعه event . مثل قبل این متد یک نام تابع می گیرد و یک نوع واقعه
document.removeEventListener("mousemove", myFunction); |
Style & Animation
این ویژگی برای برگرداندن لیست style های یک element است . برای این که بتوان ست کرد و یا مقدار دهی کرد.
document.querySelector('.crayon-plain').style //CSSProperties
مقداری که برگردانده می شود از این ویژگی یک css2properties object است که می توان به آن استایل خاص را اضافه و حذف و بروزرسانی کرد.
برای افزودن استایل به یک html element از یکی از روش های style css properties یا cssText properties استفاده می کنیم.
<div class="note">JavaScript CSS</div> const note = document.querySelector('.note'); note.style.backgroundColor = 'yellow'; note.style.color = 'red';
راه حل دوم استفاده از property با مقدار cssText است.
<div class="note">JavaScript CSS</div> note.style.cssText = 'color:red;background-color:yellow';
اگر بخواهیم به لیست استایل های موجود موردی را اضافه کنیم باید به روش زیر اقدام کنیم:
<div class="note">JavaScript CSS</div> note.style.cssText += 'color:red;background-color:yellow';
نکته مهم : با استفاده از جاوا اسکریپت و Css می توان حالت های انیمیشن برای المان ها ایجاد کرد. برای این کار از دو قابلیت css می توانید استفاده کنید:
- Transition : این قابلیت باید یک Property در دو حالت (اولیه و بعد از event) موجود باشد .در این قابلیت نمی توان از display: none استفاده کرد.
- Keyframes : این همان css animation است که با استفاده از آن می توانید انیمیشن ایجاد کنید. مطمئنا المان پس از پدیدار شدن انیمیشن خود را اجرا می کند.در این روش می توان از display: none استفاده کرد و کلید آن همین است.
دیدگاهتان را بنویسید