სელექტორები
ხშირ შემთხვევაში ვებგვერდზე სტატიკური კონტენტის გარდა საჭიროა დინამიურადაც გამოვიტანოთ კონტენტი. წარმოვიდგინოთ მაღაზიის ვებგვერდი. რათქმაუნდა თითოეულ პროდუქტს HTML-ში ხელით არ დავწერთ, უფრო ეფექტური მიდგომა იქნება, რომ ჯერ სერვერიდან წამოვიღოთ ინფორმაცია იმის შესახებ, თუ რა პროდუქტები არის გამოსატანი ვებგვერდზე და შემდგომ ნაწილ-ნაწილ გამოვიტანოთ ვიზუალზე პროდუქტები. ამისათვის საჭიროა ჯერ შესაბამისი HTML ელემენტი ამოვიღოთ სელექტორების საშუალებით და შემდგომ მასში დავარენდეროთ კონტენტი.
რა არის სელექტორი ?
სელექტორი ეს არის ტექსტი, რომლის მიხედვითაც ბრაუზერი მოგვაწვდის შესაბამის ელემენტს ან ელემენტებს.
სელექტორი შესაძლოა იყოს:
- თეგის სახელი
- კლასი
- იდ
- ატრიბუტები
- ფსევდო კლასებით
- CSS სელექტორი
მაგალითად:
const selector1 = 'button'; // თეგის სახელით
const selector2 = '.button'; // კლასი
const selector3 = '#button'; // იდ
const selector4 = '[data-value]'; // ატრიბუტით
const selector5 = '[data-value="22"]'; // ატრიბუტი სპეციფიკური მნიშვნელობით
const selector6 = 'main > p:first-child'; // პირველი პ ელემენტი მეინში
const selector7 = 'main > p:nth-of-type(3)'; // მესამე პ ელემენტი მეინში
const selector8 = ':not(section)'; // ყოველი ელემენტი გარდა სექციისა
შენიშნეთ, რომ ეს იგივე CSS-ის სელექტორებია?
სელექტორები გამოიყენება document
ობიექტისა და დომის კვანძების სხვადასხვა მეთოდებში,
რომლის მიხედვითაც შესაძლებელია ამოვიღოთ ელემენტები.
ელემენტების ძებნა
ელემენტების მოსაძებნად გვაქვს ჩაშენებული მეთოდები, რომლებიც მოდის ობიექტიდან.
მოძებნილი ელემენტი ისეთივე DOM-ის კვანძია, როგორც თვითონ document
, მაშასადამე მასზე მანიპულაცია შეგვიძლია.
განვიხილოთ ელემენტების მოსაძებნად განკუთვნილი მეთოდები.
querySelector
querySelector
არის მეთოდი, რომელიც გამოიყენება ერთი ელემენტის მოსაძებნად.
ის პარამეტრად იღებს სელექტორს და აბრუნებს პირველივე ელემენტს,
რომელიც დააკმაყოფილებს სელექტორის პირობას, ხოლო თუ ვერ იპოვა მსგავსი ელემენტი - დააბრუნებს null
.
მაგალითები:
const p = document.querySelector('p');
const button = document.querySelector('.btn');
const displayResult = document.querySelector('#result');
const highlightedParagraph = document.querySelector('p.highlight');
სხვა მეთოდებისგან განსხვავებით querySelector
შედარებით უფრო მეტი შესაძლებლობა აქვს, რადგან შეიძლება ელემენტი მოვძებნოთ
არა კონკრეტულად თეგის სახელით, კლასით ან აიდით, არამედ თითქმის ნებისმიერი CSS-ის სელექტორის მიხედვით.
querySelectorAll
querySelectorAll
არის querySelector
-ის მსგავსი მეთოდი მცირედი განსხვავებით.
querySelectorAll
აბრუნებს ყოველ იმ ელემენტს, რომელიც დააკმაყოფილებს სელექტორის პირობას. პოვნის შემთხვევაში დააბრუნებს მასივის მსგავს ობიექტს
- NodeList
-ს, რომელზეც შეიძლება მასივის forEach
მეთოდის
გამოყენება.
მაგალითები:
const paragraphs = document.querySelector('p');
const actionButtons = document.querySelector('.action');
const elementsWithData = document.querySelector('[data-value]');
getElementById
getElementById არის მეთოდი, რომელიც გამოიყენება ერთი კონკრეტული ელემენტის ამოსაღებად
id
-ის გამოყენებით. არგუმენტად იღებს id
-ს და დააბრუნებს პირველივე ელემენტს,
რომელიც დააკმაყოფილებს პირობას. ვერ პოვნის შემთხვევაში - დააბრუნებს null
.
querySelector
-ისგან განსხვავებით, ის მხოლოდ id
-ით მიხედვით ეძებს ელემეტნს და არა სელექტორით,
შესაბამისად არ სჭირდება #
პრეფიქსი.
მაგალითები:
const displayResult = document.getElementById('result');
const counter = document.getElementById('counter');
getElementsByTagName
getElementsByTagName არის მეთოდი, რომელიც გამოიყენება რამდენიმე ელემენტის ამოსაღებად
ელემენტის თეგის სახელის გამოყენებით. მეთოდი არგუმენტად იღებს თეგის სახელს და აბრუნებს
იმ ელემენტების NodeList
-ს, რომლებიც განთავსებულია მიწოდებული თეგით, ვერ პოვნის შემთხვევაში - აბრუნებს null
-ს.
მაგალითები:
const paragraphs = document.getElementsByTagName('p');
const buttons = document.getElementsByTagName('buttons');
getElementsByTagName
-ზე უფრო მოქნილი ვერსია არის querySelectorAll
.
getElementsByClassName
getElementsByClassName არის მეთოდი, რომელიც გამოიყენება რამდენიმე ელემენტის
ამოსაღებად კლასის სახელის მიხედვით. მეთოდი არგუმენტად იღებს კლასის სახელს და აბრუნებს იმ ელემენტების NodeList
-ს, რომლებსაც გააჩნიათ მითითებული კლასი,
ხოლო ვერ პოვნის შემთხვევაში - null
-ს.
მაგალითები:
const highlightedTexts = document.getElementsByClassName('highlight');
const actionButtons = document.getElementsByClassName('action');
querySelectorAll
-სგან განსხვავებით getElementsByClassName
არ სჭირდება კლასის პრეფიქსი .
.
getElementsByName
getElementsByName
არის მეთოდი, რომელიც გამოიყენება რამდენიმე ელემენტის ამოსაღებად
ელემენტის name
ატრიბუტის გამოყენებით. მეთოდი არგუმენტად იღებს name
-ს და აბრუნებს იმ ელემენტების NodeList
-ს, რომლებსაც გააჩნიათ მიწოდებული მნიშვნელობის name
ატრიბუტი.
ვერ პოვნის შემთხვევაში აბრუნებს null
-ს.
მაგალითები:
// იპოვის ელემენტებს <input name="some-random-radio-inputs">
const radioInputs = document.getElementsByName('some-random-radio-inputs');
მსგავსი ტიპის ელემენტები შეიძლება იყოს,
ნებისმიერი HTML ელემენტი, მათ შორის <meta>
, <object>
და ისეთი ელემენტებიც კი, რომელსაც რეალურად არ გააჩნია name
ატრიბუტი (მაგალითად: <div name="some">
ელემენტის ამოღებაც შეიძლება).
ერთი კვანძიდან მეორეზე
DOM-ში კვანძების ობიექტები ისე არის აგებული, რომ ნავიგაცია ნებისმიერი ელემენტიდან შეგვიძლია დავიწყოთ და გავიდეთ ნებისმიერ სხვა ელემეტნზე. ეს ყველაფერი კარგად ორგანიზებული ობიექტებით არის შესაძლებელი. განვიხილოთ რამოდენიმე ძირითადი თვისება, რომელიც დაგეხამრება ნავიგაციაში.
parentNode
parentNode
თვისება გვიბრუნებს ამოღებული ელემენტის მშობელ ელემენტს. თუ ელემენტი ახალი შექმნილია
და ჯერ არცეთ ელემენტზე არ არის დამატებული, მაშინ მისი მშობელი ელემენტი null
გამოდის.
სხვა შემთხვევაში, დაბრუნებული ელემენტი არის Node
ტიპის.
childNodes
childNodes
თვისება აბრუნებს ყოველ შვილობილ ელემენტს, მათ შორის კომენტარსაც კი. დაბრუნებული მნიშვნელობა
არის NodeList
ტიპის.
children
children
თვისება აბრუნებს ყოველ შვილობილ ელემენტს გარდა კომენტარებისა. დაბრუნებული მნიშვნელობა არის
HTMLCollection
ტიპის.
firstElementChild
firstElementChild
თვისება აბრუნებს პირველ შვილობილ ელემენტს, თუ ის არ არსებობს,
დააბრუნებს null
-ს. დაბრუნებული ელემენტი არის Element
ტიპის.
lastElementChild
lastElementChild
თვისება აბრუნებს ბოლო შვილობილ ელემენტს. თუ ის არ არსებობს -
დააბრუნებს null
-ს. დაბრუნებული ელემენტი არის Element
ტიპის.
nextElementSibling
nextElementSibling
აბრუნებს შემდგომი ელემენტის მნიშვნელობას,
თუ ბოლო ელემენტია, დააბრუნებს null
-ს. დაბრუნებული ელემენტი არის Element
ტიპის.
previousElementSibling
previousElementSibling
აბრუნებს წინა ელემენტის მნიშვნელობას,
თუ ის თავად არის პირველი ელემენტი, დააბრუნებს null
. დაბრუნებული ელემენტი არის Element
ტიპის.
განვიხილოთ თითოეული თვისების მაგალითები:
<div id="parent">
<div id="child1"></div>
<div id="child2"></div>
<div id="child3"></div>
</div>
const parent = document.querySelector('#parent');
const child = document.querySelector('#child2');
console.log(parent.childNodes); // [ #text, <div id="child1"></div>, #text, <div id="child2"></div>, #text, <div id="child3"></div>, #text ]
console.log(parent.children); // [ <div id="child1"></div>, <div id="child2"></div>, <div id="child3"></div> ]
console.log(parent.firstElementChild); // <div id="child1"></div>
console.log(parent.lastElementChild); // <div id="child3"></div>
console.log(child.parentNode); // <div id="parent">...</div>
console.log(child.parentnextElementSiblingNode); // <div id="child3"></div>
console.log(child.previousElementSibling); // <div id="child1"></div>
შეჯამება
ამ თავში მიმოვიხილეთ სელექტორები და მათი გამოყენების ნიმუშები. ხშირ შემთხვევაში გამოიყენებთ შემდეგ მეთოდებს:
querySelector
,
querySelectorAll
,
getElementById
,
getElementsByName
.
querySelector
-ს გამოიყენებთ როცა ერთი ელემენტის ამოღება გსურთ,
querySelectorAll
-ს გამოიყენებთ მაშინ როცა ბევრი ერთნაირი ელემენტის ამოღება გსურთ,
getElementById
-ს გამოიყენებთ მაშინ, როცა id
გაქვთ და პირდაპირ ელემენტის ამოღება გინდათ ზედმეტი პრეფიქსის გარეშე,
ხოლო getElementsByName
-ს - მაშინ როცა name
ატრიბუტით გსურთ მიწვდეთ ელემენტებს.
თუ გვსურს ნავიგაცია, შეგვიძლია გამოვიყენოთ კვანძის ელემენტების თვისებები.
იხილეთ სამაგალითო კოდები playground-ში.