20. diel - Editor tabuliek v JavaScripte
V minulej lekcii, Tvorba elementov a hierarchie DOM v JavaScripte, sme sa naučili vytvoriť nový element a vložiť ho do HTML stránky.
V dnešnom tutoriále základov JavaScriptu začneme pracovať na komplexnejšej webovej aplikácii. Postupne vytvoríme editor tabuliek a zopakujeme si pri tom, ako spracovávať udalosti alebo ako tvoriť a upravovať elementy DOM. Kód našej aplikácie budeme členiť do funkcií, ktorým sme sa venovali v lekcii Funkcie v JavaScripte.
Editor tabuliek v JavaScripte
Tabuľky sú kľúčovým prvkom mnohých webových stránok, poskytujú totiž užitočnú štruktúru na prezentáciu dát. V tomto tutoriále využijeme naše doterajšie znalosti HTML, CSS a samozrejme JavaScriptu, aby sme si vytvorili funkčný a interaktívny editor tabuliek.
Náš editor tabuliek bude mať v predvolenom nastavení tri riadky a päť stĺpcov. Nad tabuľkou budú umiestnené tlačidlá umožňujúce meniť jej veľkosť. Ak používateľ vyberie v tabuľke nejakú z buniek, bude môcť kliknutím na dané tlačidlo pridať riadok či stĺpec do tabuľky. V týchto prípadoch zvolí, či sa zmeny prejavia nad aktívnou bunkou alebo pod ňou. Podobným spôsobom bude môcť riadok a stĺpec s aktívnou bunkou zmazať.
Konečný výstup bude vyzerať takto:
Príprava HTML dokumentu
V projekte budeme mať tri samostatné súbory reprezentujúce HTML stránku,
CSS štýly a samotný kód v JavaScripte. Začneme tým, že si vytvoríme HTML
súbor index.html a do neho doplníme jednoduchý kód:
<!DOCTYPE html> <html lang="en"> <head> <title>Table editor</title> <meta charset="utf-8" /> <script src="table-editor.js"></script> <link href="table-editor.css" rel="stylesheet" /> </head> <body> </body> </html>
Všimnime si, že sme v HTML dokumente vyplnili iba jeho hlavičku. Obsah
<body> necháme prázdny, pretože si všetko potrebné
pripravíme v skripte. Je to pre nás dokonca výhodné, ak nasadíme aplikáciu
na inej stránke, nemusíme už vôbec zasahovať do HTML.
Príprava CSS štýlov
Teraz si pripravíme súbor s kódom na štýlovanie tabuľky.
V nasledujúcej ukážke použijeme znak %. Na
slovenskej klávesnici ho píšeme pomocou Ľavého SHIFT a
nasledujúceho klávesu:

V hlavičke HTML na súbor s kódom odkazujeme, má tu názov
table-editor.css a vidíme, že je umiestnený v rovnakom
priečinku. Do nového súboru vložíme kód:
table { border-spacing: 0; border: 1px solid black; width: 500px; } table, table td { padding: 0; margin: 0; } table td { border: 1px solid black; } table td input { padding: 0; margin: 0; width: 100%; border: 0px solid transparent; height: 100%; }
Tvorbu CSS nebudeme bližšie komentovať, pretože by už mala byť známa z kurzu Základy CSS3.
Práca v JavaScripte
Ako posledný vytvoríme súbor table-editor.js, ktorý postupne
doplníme naším skriptom.
Deklarácia premenných
Najprv v ňom deklarujeme štyri premenné:
let table; let columns = 5; // the default number of columns let rows = 3; // the default number of rows let activeCell;
Premenná table bude obsahovať samotnú tabuľku. Do
premenných columns a rows budeme ukladať aktuálny
počet stĺpcov a riadkov tabuľky. Týmto premenným sme zároveň nastavili
predvolenú veľkosť. Tabuľka teda bude po spustení aplikácie obsahovať
päť stĺpcov a tri riadky. Posledná premenná, activeCell, bude
obsahovať odkaz na bunku, ktorú používateľ na stránke vybral.
Vytvorenie tabuľky a buniek
Ďalej si pripravíme dve funkcie pre tvorbu tabuľky. Prvá
z nich, pomenovaná createDefaultTable(), sa zameria na vytvorenie
a umiestnenie tabuľky do nášho HTML dokumentu. Na jej konci budeme volať
funkciu createCell(), ktorá bude generovať jednotlivé bunky
tabuľky.
Kód pre generovanie tlačidiel a nastavenie ich obsluhy doplníme neskôr.
Funkcia
createDefaultTable()
Úlohou tejto funkcie je vytvorenie základnej štruktúry
tabuľky a jej vloženie do HTML dokumentu. Na základe
východiskového počtu riadkov a stĺpcov definovaných v premenných
rows a columns zostavíme celú tabuľku.
Ako vieme, tabuľka je tvorená elementom <table>, v
ktorom sú vložené elementy <tr> pre riadky a
<td> pre bunky. Najprv teda vytvoríme element
<table> a vložíme ho do tela HTML dokumentu:
function createDefaultTable() { table = document.createElement("table"); document.body.appendChild(table); }
Do premennej table sme vložili nový element vytvorený pomocou
metódy createElement(). Pretože ho chceme vložiť do
<body>, zavoláme ako rodiča document.body a na
ňom metódu appendChild() s odkazom na vytvorený element v jej
parametri.
Teraz pristúpime k vytváraniu riadkov a buniek tabuľky. Pomocou
vonkajšieho cyklu (y) pri každej iterácii vytvoríme
nový riadok a vo vnorenom cykle (x) do neho vždy
pridáme nové bunky:
function createDefaultTable() { table = document.createElement("table"); document.body.appendChild(table); for (let y = 0; y < rows; y++) { let tr = document.createElement("tr"); table.appendChild(tr); for (let x = 0; x < columns; x++) { tr.appendChild(createCell()); } } }
Na poslednom riadku uvedeného kódu voláme funkciu
createCell(), ktorá sa postará o vytvorenie a
konfiguráciu jednotlivých buniek tabuľky. Tvorba bunky
tabuľky bude obsahovať viac krokov, preto pre ňu vytvoríme samostatnú
funkciu.
Funkcia createCell()
Bunku tabuľky vo webových dokumentoch reprezentuje element
<td>. Vo funkcii createCell() teda najskôr
vytvoríme tento element. Ďalej bunke pridáme element
<input> a určíme, že bude reprezentovať textové pole, do
ktorého môžu používatelia písať. Pred vložením elementu
<input> do <td> ešte umožníme
používateľom editovať obsah bunky priamo v tabuľke. Nastavíme mu udalosť
onfocus, ktorá nastane, keď používateľ klikne na textové pole
alebo do neho vstúpi pomocou klávesnice napríklad tabulátorom.
Táto udalosť nám pomôže určiť, ktorá bunka je v danom okamihu
aktívna, čo je dôležité pre ďalšie interakcie s tabuľkou.
Akonáhle je bunka aktívna, uložíme si odkaz na ňu do premennej
activeCell pomocou kľúčového slova this. Vďaka
tomu budeme môcť s aktívnou bunkou ľahko pracovať v ďalších častiach
kódu.
Nakoniec takto pripravený <input> vložíme do bunky a
vrátime ju pomocou return. Celý kód funkcie vyzerá takto:
function createCell() { let td = document.createElement("td"); let tdInput = document.createElement("input"); tdInput.type = "text"; // we set the input element as a text field tdInput.onfocus = function() { activeCell = this; // when the input is active, we save the reference to that cell }; td.appendChild(tdInput); return td; // we return the created cell }
Kľúčové this v uvedenom kóde odkazuje na
objekt, ktorý vyvolal danú udalosť onfocus. V našom prípade
bude this odkazovať na konkrétne textové pole
(tdInput), ktoré bolo vybrané kliknutím myši alebo pomocou
tabulátora. Vďaka tomu môžeme napísať všeobecný kód, ktorý bude
použiteľný pre viacero elementov a nemusíme teda explicitne odkazovať na
každý jednotlivý element.
Teraz môžeme zavolať funkciu createDefaultTable() a vytvoriť
tabuľku v dokumente. Funkciu spustíme pri načítaní stránky pomocou
udalosti onload na objekte window. Takto zaistíme,
že tabuľka bude vytvorená a pripravená na použitie ihneď po načítaní
stránky:
window.onload = function () { createDefaultTable(); }
Tabuľka bude vyzerať takto:
V konzole nájdeme štruktúru vytvorenej tabuľky na záložke Elements:

Tvorba tlačidiel
Tabuľku máme pripravenú a môžeme sa zamerať na doplnenie tlačidiel,
ktoré používateľovi umožnia tabuľku upravovať. Pretože ich bude viac,
vytvoríme si pre pridanie tlačidla ďalšiu funkciu s názvom
createButton(). V parametri jej budeme zadávať text, ktorý má
byť tlačidlu nastavený ako popis. Funkcia teda vytvorí tlačidlo, nastaví
mu popis, vloží ho do predka a vráti ho:
function createButton(label) { let btn = document.createElement("button"); btn.textContent = label; document.body.appendChild(btn); return btn; }
Tlačidlo vraciame kvôli tomu, aby sme mu mohli neskôr nastaviť obsluhu udalosti.
Teraz vytvoríme samotné tlačidlá. Urobíme to vo funkcii
createControlButton(), kde budeme volať našu pomocnú
funkciu:
function createControlButtons() { createButton("Insert row below"); createButton("Insert row above"); createButton("Insert column to left"); createButton("Insert column to right"); createButton("Remove row"); createButton("Remove column"); }
Vrátené tlačidlá si neukladáme, neskôr im tu priradíme obsluhu udalosti.
Volanie funkcie createButton() by sme mohli
vložiť do cyklu a načítať v ňom popisky tlačidiel, ktoré by sme mali
uložené v poli. Neskôr tu však budeme nastavovať obsluhu udalostí pre
každé tlačidlo, preto tu necháme vytvoriť tlačidlá samostatne.
Funkciu zavoláme v obsluhe udalosti window.onload:
window.onload = function () { createControlButtons(); // we added this line createDefaultTable(); }
Výsledok:
Funkcie pre tvorbu riadku
Na záver si dnes ešte napíšeme funkciu, ktorú zavoláme, keď budeme
chcieť vytvoriť nový riadok. Vytvoríme v nej nový element
<tr> a vložíme doň rovnaký počet buniek, ako majú už
existujúce riadky. Aktuálny počet buniek vezmeme z prvého riadku a získame
ho pre názornosť najprv postupne v troch krokoch:
let firstRow = table.firstElementChild; // gets the first row of the table, element <tr> let firstRowCells = firstRow.querySelectorAll("td"); // gets all the <td> elements of the first row let firstRowCellsCount = firstRowCells.length; // returns the number of retrieved <td> elements
Najprv sme vyhľadali prvý riadok tabuľky, v ktorom som našli všetky
elementy <td> a pomocou vlastnosti length
zistili ich počet.
Teraz uvedené kroky zreťazíme a zapíšeme všetko priamo do premennej
firstRowCellsCount. Podobne budeme vlastnosti a metódy reťaziť
aj v ďalších funkciách:
let firstRowCellsCount = table.firstElementChild.querySelectorAll("td").length;
Premennú firstRowCellsCount potom využijeme v cykle, ktorým
naplníme nový riadok zodpovedajúcim počtom nových buniek. Vytvorený riadok
nakoniec vrátime. Celý kód funkcie createRow() bude vyzerať
takto:
function createRow() { let newRow = document.createElement("tr"); let firstRowCellsCount = table.firstElementChild.querySelectorAll("td").length; for (let i = 0; i < firstRowCellsCount; i++) { // the loop will have the same number of iterations as the first row cells newRow.appendChild(createCell()); // we add one new cell to every new row } return newRow; }
Funkciu na pridanie riadka máme týmto pripravenú, neskôr ju budeme v aplikácii volať na pridanie riadka pred aktívnu bunku alebo za ňu.
V ďalšej lekcii, Dokončenie editora tabuliek v JavaScripte, sa naučíme do editora tabuliek vkladať nové stĺpce a riadky. Doplníme do neho aj funkcie na ich zmazanie.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 113x (1.56 kB)
Aplikácia je vrátane zdrojových kódov v jazyku JavaScript
