Jediný způsob, jak změnit webovou stránku o nové informace, je obnovit stránku a pracovat na požadavku, ale tento způsob je příliš hrubý a neefektivní. Lepším způsobem, jak dosáhnout stejného výsledku, ale s maximální efektivitou a profesionalitou, je AJAX protokol .
AJAX je zkratka pro Asynchrouns javascript and XML , a navzdory svému názvu může na webovou stránku přinést jakýkoli druh nových dat, aniž by bylo nutné je obnovovat připojením k databázi nebo k rozhraní API.
AJAX dělá v podstatě dvě důležité věci:
- Připojte se k serveru/rozhraní API
- Načtěte data
- Změňte webovou stránku
Každý z tohoto kroku je zcela na našem uvážení, protože jde o techniku, která nabízí velkou flexibilitu v našich koncích a spoustu abstrakce v tom, jak provádí skutečné operace.
Tato technika se používá prostřednictvím javascriptového objektu nazvaného XMLHttpRequest :
const ajax = new XMLHttpRequest();
nyní, když máme objekt, potřebujeme přiřadit funkci onreadystatechange metoda, která bude volána pokaždé, když se změní vnitřní stav objektu:
ajax.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200 {
// execute what's here
}
}
Vše uvnitř přiřazené funkce by mělo být vždy uvnitř příkazu if .
První věc, kterou je třeba zkontrolovat, je atribut readyState objektu.
Tyto atributy mohou mít pět různých hodnot v rozsahu od 0 do 4 a 4 znamená, že operace jsou plně dokončeny.
Pro referenci můžete jít sem.
Atribut stavu odkazuje na protokol HTTP:200 znamená, že bylo úspěšné, 404 že to, co bylo požadováno, nebylo nalezeno a tak dále.
Kompletní dokumentaci naleznete zde.
Pokud jsou readyState a status na 4 a 200, znamená to, že vše proběhlo úspěšně a je v tomto stavu, že chcete provést jakoukoli změnu na webové stránce.
Nyní, když je vše nastaveno, potřebujeme pouze načíst data ze serveru. pomocí odeslat funkci inicializujeme požadavek a pomocí odeslat jedním spustíme data:
url= 'https://myapi.com';
ajax.open('GET', url, true);
ajax.send();
otevřené metoda přijímá tři parametry:
- Metoda požadavku, kterou ve většině případů chceme získat něco
- Řetězec, který představuje adresu URL, na kterou se má požadavek odeslat
- Pokud musí být požadavek asynchronní, což je samozřejmě
true
metoda send je ta, která provádí všechny operace podtržení potřebné k provedení změn na webové stránce.
Integrace AJAX s naším vybraným backendovým jazykem je velmi snadná, pomocí webového serveru pro hostování našich webových stránek a PHP můžeme nastavit volání určeného skriptu, který provádí operace v podstatě vytvářející naše vlastní API.
Vezměte prosím na vědomí, že bez základních znalostí PHP nebudete schopni plně porozumět dalšímu kódu.
Pojďme vytvořit jednoduchou webovou stránku, která dynamicky vytvoří a aktualizuje tabulku.
Jediný kód, který potřebujeme v našem html souboru, je:
<label for="cols">rows:</label>
<input type="text" id="cols" name="cols" onkeyup="SetCols(this.value)" onload="this.value=''">
<label for="rows">cols:</label>
<input type="text" id="rows" name="rows" onkeyup="SetRows(this.value)">
<span id="out"></span>
Tento kód definuje tři jednoduché věci:
- vstupní pole pro sloupec tabulky
- vstupní pole pro řádky tabulky
- rozpětí, které bude obsahovat výstup požadavku AJAX, naši tabulku
Než vysvětlíme skutečný kód, podívejme se na proměnnou, kterou budeme používat:
// before calling our backend we have to first polish the data
// that we are going to send.
// php accepts everything as a request
// our variables are just pieces of the request
// that will then be concatenated
let cols = '';
let rows = '';
let script = '';
let output = document.getElementById("out");
let ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// we receive from the script a table in html
// and then we replace it with the old one
output.innerHTML = this.responseText;
}
}
Jak vidíme v kódu HTML, pokaždé, když změníme hodnotu vstupního pole, zavolá se vyhrazená funkce, která nastavuje řádky a sloupce, podívejme se na ně:
function SetCols(ncols) {
cols = 'cols=' + ncols;
if (rows != '') {
CreateTable();
}
}
function SetRows(nrows) {
rows = 'rows=' + nrows;
if (cols != '') {
CreateTable();
}
}
Funkce pouze nastaví proměnnou rows nebo cols způsobem, kterému PHP rozumí, a pokud ta druhá není neplatná, zavolá createtable
funkce, která:
function CreateTable() {
script = 'make_ajax_table.php?' + cols + '&' + rows;
// console.log(script);
ajax.open('GET', script, true);
ajax.send();
}
to, co posíláme do PHP skriptu, je jen řádek s požadavkem, který obsahuje rows
a cols
proměnné.
Nyní se podívejme na skutečný PHP skript:
$cols = $_REQUEST['cols'];
$rows = $_REQUEST['rows'];
try {
$cols = (int)$cols;
$rows = (int)$rows;
}
catch (exception $e) {
echo 'hi, something strange happened. <br> Let the developers know of this error ' . $e;
}
finally {
echo '<table border=1>';
for($i = 1; $i < $cols+1; $i++)
{
echo '<tr>';
for ($j = 1; $j < $rows+1; $j++)
{
echo '<td>' . $j * $i . '</td>';
}
echo '</tr>';
}
echo '</table>';
}
Vše, co odešleme, se transponuje jako řetězec a poté se vloží do vnitřního kódu HTML značky span.
Pojďme se podívat na konečný výsledek:
Úplný kód najdete v githubu zde