تعداد بازدید: 620

HTML Element Node

هر سند html از ساختار های مختلفی تشکیل شده است. این ساختار به صورت درختی است و هر قسمت از این ساختار یک موجودیت خاص می باشد که خود می تواند موجودیت های متفاوتی را تشکیل دهد.

html-dom-tree
در ساختار بالا اصلی ترین موجودیت های متشکل از 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 های فرزند لیست #main_list را بر می گرداند.

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

در این حالت اگر :

  • اگر element node باشد 1
  • اگر attribute node باشد 2
  •  اگر text node باشد 3
  • اگر comment node باشد 4
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 استفاده کرد و کلید آن همین است.

مطالب مشابه

Window Object Properties

شئ جاری در Browser Environment یک سری اطلاعات در قالب یک سری ساختمان داده در رابطه با اطلاعات صفحه وب فعلی از قبیل...

ویژگی Event در ساختار Dom

event هم یک موجودیت در ساختار dom می باشد که به ازای هر HTML Object یک سری Attribute یا ویژگی خواهیم داشت که یکی از آن...

webpack javascript module bundler

Webpack Module Bundler Part 2

وب پک یک نرم افزار است که در قالب یک کتابخانه و یک ابزار توسعه برای ساخت سایر نرم افزار ها در با استفاده از node...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای HTML Element Node

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *