Cilj ove lekcije je da se učenici upoznaju sa par načina za jednostavno čitanje txt ili JSON fajla pomoću jQuery AJAX ili Fetch API

Napomena: čitanje iz fajlova je zvanično u planu tek u 4. razredu, ali ... tada će se raditi u drugoj tehnologiji (ASP.NET) 


Kako se čita sadržaj fajla?

Ako treba da se pročita sadržaj nekog fajla i postavi na web stranicu pomoću JavaScript-a, proces zavisi od toga gde se fajl nalazi i kako mu se pristupa. Postoje dva glavna scenarija:

1. Fajl se nalazi na serveru (npr. podaci.txt ili podaci.json

U ovom slučaju, koristi se Fetch API za slanje HTTP zahteva serveru.
    * U starijim aplikacijama se koristi AJAX za slanje zahteva serveru.
    * Malčice novija varijanta je jQuery metoda .get() koja koristi AJAX u pozadini 
Server zatim vraća sadržaj fajla.
JavaScript može preuzeti taj sadržaj i ubaciti ga u stranicu

2. Fajl se nalazi na klijentovom računaru (lokalno)

Ako korisnik treba da učita fajl sa svog računara, JavaScript ne može direktno pristupati fajlovima iz bezbednosnih razloga. Međutim, može koristiti File API zajedno sa <input type="file">.

Ukratko:

Kada korisnik pokrene neki događaj (npr. klikne na dugme), JavaScript može poslati HTTP zahtev serveru koristeći Fetch API ili AJAX sa jQuery.
Server zatim obrađuje zahtev i vraća podatke koje JavaScript ubacuje u stranicu.

Voditi računa da:

Web browser vrši blokiranje preuzimanja lokalnih podataka na web stranicama.

Bez upotrebe web servera, direktno čitanje lokalnog fajla u web stranici pomoću HTML-a i JavaScript-a nije moguće iz sigurnosnih razloga.
Web browser će da blokira pristup lokalnim fajlovima (osim ako korisnik ne otvori fajl direktno putem file:// protokola), da bi se sprečile sigurnosne pretnje.


Kako ćemo da radimo:
    Iako se za stvarni rad u produkciji mora koristiti web server, za razvoj može da se pokrene lokalni web server.
    Znači: ili ćemo da radimo direktno na web serveru (Apache - XAMPP/htdocs) ili ćemo koristiti Live Server (VS Code).


Asinhrona komunikacija

Kada treba preuzeti podatke iz nekog faja, preporuka je da se koristi asinhrona komunikacija i asinhrono programiranje.

Asinhrono programiranje je tehnika koja omogućava izvršavanje koda bez čekanja da se završi prethodni zadatak.

Pogledajte, iza dugmeta, malo detaljnija objašnjenja:

Asinhrono slanje i preuzimanje podataka omogućava web stranicama da komuniciraju sa serverom bez osvežavanja stranice. Ovo omogućava bržu interakciju sa korisnikom, jer se podaci šalju i preuzimaju u pozadini, bez ometanja rada sajta.

Primeri : automatsko učitavanje novih objava na društvenim mrežama, provera dostupnosti korisničkog imena tokom registracije, učitavanje komentara bez osvežavanja cele stranice, ....

 Sinhrono vs. Asinhrono

📌 Sinhrono programiranje – Svaka naredna operacija čeka da se prethodna završi.
📌 Asinhrono programiranje – Program ne čeka, već prelazi na sledeći zadatak.

🔎 Zamislite da naručujte kafu u kafiću:

  • Sinhroni način: Stojite pored šanka dok konobar ne pripremi kafu. Tek tada možete naručiti nešto drugo.
  • Asinhroni način: Konobar uzima porudžbinu, ali vi možete raditi nešto drugo dok kafa ne bude gotova. Kada je spremna, konobar vas obavesti.

LINKVIZUELNI prikaz ovog primera sa dodatnim objašnjenjima

💡 Zamislite da čitate fajl sa servera:

  • Sinhroni način: Program bi se zaustavio dok se fajl ne učita, što može trajati više sekundi.
  • Asinhroni način: Program nastavlja sa radom i obradiće fajl čim podaci budu dostupni.

U nastavku su prikazana dva načina rada: Fetch API (noviji) i jQuery metoda .get() (starija varijanta)

1️⃣ Fetch API – Moderna metoda za asinhrono slanje i preuzimanje podataka

Fetch API omogućava slanje i preuzimanje podataka koristeći Promise objekte, a najnovija verzija koristi async i await.

📝 Primer: Preuzimanje podataka iz JSON fajla
   async function ucitajPodatke() {
      let response = await fetch("podaci.json");  // Šalje GET zahtev ka serveru
      let data = await response.json();          // Pretvara odgovor u JavaScript objekat
      console.log(data);                         // Podatke ispisuje u konzoli
   }

   ucitajPodatke();

🔹 Šta se dešava?

  1. fetch("podaci.json") – JavaScript šalje HTTP zahtev.
  2. await response.json() – Podaci se konvertuju iz JSON formata.
  3. console.log(data) – Prikaz podataka u konzoli.
🔹 U cilju bolje ilustracije, iza dugmeta je primer preuzimanja podataka iz JSON fajla sa poznate web adrese: 

💡 Sa async/await – jednostavnije i preglednije

  async function ucitaj() {
    try {
        let response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
        let data = await response.json();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
  }
  ucitaj();

2️⃣ AJAX sa jQuery ($.get i $.post)

 jQuery olakšava asinhrone zahteve pomoću kraće i jednostavnije sintakse.

 📝Učitavanje TXT fajla pomoću $.get
   $.get("tekst.txt", function(podaci) {
       console.log(podaci);
   });

 ✅ Šta radi?

  • $.get("tekst.txt", funkcija) – Učitava sadržaj fajla i prosleđuje ga funkciji.
  • Podaci se prikazuju u konzoli ili se ubacuju u stranicu.

4️⃣ Koju tehnologiju koristiti?

🚀 Fetch API je preporučena metoda za nove projekte, ali ako se već koristi jQuery, onda može i $.get i $.post.


5️⃣ Poređenje metoda
Metod Prednost Nedostatak
Fetch API Moderniji pristup Ne podržavaju ga vrlo stari browseri
jQuery AJAX Kompatibilan sa starijim kodom Zahteva jQuery biblioteku


Pitanja i odgovori (iza dugmića):

🔹 Šta je JSON ? 


Kada programi međusobno razmenjuju podatke, ti podaci moraju biti zapisani u nekom formatu. JSON (JavaScript Object Notation) je jednostavan format koji se koristi za čuvanje i slanje podataka. Liči na JavaScript objekte, ali ga mogu koristiti i drugi programski jezici.

Druga definicija:  JSON (Džejson) je način zapisivanja podataka tako da ih programi mogu lako čitati i koristiti. Možete ga zamisliti kao tabelu podataka zapisanu u obliku teksta.


Primer običnih podataka u JavaScript-u, napisanih na dva načina:

  let proizvod = {
ime: "Laptop",
cena: 50000
};
console.log(proizvod.ime); // Ispisuje "Laptop"

ili

  let proizvod = { ime: "Laptop", cena: 50000 };
console.log(proizvod.ime); // Ispisuje "Laptop"

Sada, ti isti podaci zapisani kao JSON (samo tekst!):

  {
"ime": "Laptop",
"cena": 50000
}

🔹 JSON je običan tekst, ali zapisuje podatke kao parove ime-vrednost.
🔹 Izgleda slično JavaScript objektima, ali koristi dvostruke navodnike "".
🔹 Svi brojevi pišu se bez navodnika, a tekst u navodnicima.

JSON je samo tekst – ne može imati funkcije kao JavaScript objekti.

Kako JavaScript može da koristi JSON?


  Pretvaranje JSON teksta u JavaScript objekat:

  let jsonTekst = '{"ime": "Laptop", "cena": 50000}';
let objekat = JSON.parse(jsonTekst); // Pretvara JSON u JavaScript objekat
console.log(objekat.ime); // Ispisuje "Laptop"

Ako treba da pretvorimo JavaScript objekat nazad u JSON:

  let jsonString = JSON.stringify(objekat);
console.log(jsonString); // Ispisuje: '{"ime":"Laptop","cena":50000}'

🔹 Kako rade async i await?  

1️⃣ async – Deklariše asinhronu funkciju

Kada funkciju označimo kao async, ona automatski vraća Promise. To znači da može da sadrži await i da radi asinhrono.

async function mojaFunkcija() {
    return "Pozdrav!";
}

mojaFunkcija().then(console.log); // Ispisuje: Pozdrav!

🔹 Objašnjenje:

  • Funkcija mojaFunkcija() vraća "Pozdrav!", ali zato što je async, vraća ga kao Promise.
  • then(console.log) omogućava da sačekamo rezultat i ispišemo ga u konzoli.

2️⃣ await – Čeka da se Promise završi

Ključna reč await omogućava da "sačekamo" završetak asinhronog zadatka pre nego što se nastavi dalje izvršavanje koda. Može se koristiti samo unutar async funkcija.

Primer: Učitavanje podataka pomoću Fetch API
async function ucitajPodatke() {
    let response = await fetch("https://jsonplaceholder.typicode.com/todos/1"); // Čekamo odgovor sa servera
    let data = await response.json(); // Čekamo konverziju u JSON format
    console.log(data); // Prikaz podataka
}

ucitajPodatke();

🔹 Kako radi?

  1. await fetch(...) – Sačekaj da se HTTP zahtev izvrši.
  2. await response.json() – Sačekaj da se podaci konvertuju iz JSON-a u objekat.
  3. Tek kada su podaci spremni, izvršava se console.log(data).


Pisanje asinhronog koda izgleda kao običan sekvencijalni kod, što ga čini čitljivijim i lakšim za održavanje.


🔹 Šta su Promise objekti u JavaScript-u?

Promise je objekat u JavaScript-u koji predstavlja rezultat asinhrone operacije – bilo da je uspešna (ispunjen promise) ili neuspešna (odbijen promise). Koristi se da reši problem asinhronog koda bez upotrebe callback funkcija (tzv. „callback hell“).

1. Kako radi Promise?

Zamislimo obećanje (promise) kao naručivanje hrane u restoranu:

  • Naručimo hranu → Šaljemo zahtev (asinhrona operacija).
  • Sačekamo da kuvar završi → Proces traje neko vreme (pending stanje).
  • Hrana stiže → Obećanje je ispunjeno (fulfilled).
  • Restoran nema sastojke → Obećanje je odbijeno (rejected).

2. Stanja Promise objekta

Promise može imati tri stanja:

Stanje Opis
pending Obećanje je u toku – operacija još nije završena.
fulfilled Obećanje je ispunjeno – operacija je uspešna.
rejected Obećanje je odbijeno – operacija nije uspela.


Ukratko:

Promise je objekt koji predstavlja obećanje da će se neki kod izvršiti u budućnosti. Može biti u tri stanja:
    ✔ Pending (čeka se izvršenje)
    ✔ Resolved (uspešno izvršeno)
    ✔ Rejected (došlo je do greške)

...

🔹 Šta ako se fajl ne uspe pročitati?  

 Preporuka je da se, za svaki slučaj, koristi provera da li je došlo do greške.

U slučaju AJAX-a i metode $.get() - koristi se metoda $.fail()

$.get('nepostojeca-stranica.json')
.done(function (data) {
console.log('Podaci:', data);
})
.fail(function (xhr, status, error) {
console.error('Greška:', status, error);
});

Fetch API :

  • Fetch API NE baca grešku (throw error) ako server odgovori sa HTTP greškom (npr. 404 Not Found ili 500 Internal Server Error).
  • Grešku baca samo ako postoji problem sa mrežom (npr. ako nema interneta, domen ne postoji, ili je CORS blokiran).

Zbog toga se try-catch koristi za hvatanje mrežnih grešaka, dok se HTTP greške proveravaju ručno pomoću response.ok

async function getData() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');

// Provera da li je HTTP status uspešan (2xx)
if (!response.ok) {
throw new Error(`HTTP Greška! Status: ${response.status}`);
}

let data = await response.json();
console.log('Podaci:', data);
} catch (error) {
console.error('Greška:', error.message);
}
}

getData();

...


🔹 Vežbe: 


Zadatak 1️⃣ - Učitavanje tekstualnog fajla pomoću Fetch API-ja
  1. Napraviti TXT fajl sa nekoliko redova teksta.
  2. Koristiti Fetch API da se taj fajl učita, svaki red prikaže u posebnom paragrafu.
Saveti za rad:
  1. Prvo raditi sa osnovnom sintaksom - bez try/catch i bilo kakvih provera
  2. Dodati try-catch i promeniti naziv fajla. Šta se dešava?
  3. Dodati proveru response.ok i ponovo promeniti naziv fajla. Šta se dešava?

    🔹 Kao pomoć u radu pogledajte sledeći primer: učitavanje fajla podaci.txt pomoću Fetch API-ja

Primer: učitavanje fajla podaci.txt pomoću Fetch API-ja

📂 (Fajl podaci.txt sadrži nekoliko redova teksta)

 async function ucitajTekst() {
    try {
        let response = await fetch("podaci.txt");
        if (!response.ok) {
            throw new Error("Greška pri učitavanju fajla.");
        }
        let text = await response.text();
        document.getElementById("rezultat").innerText = text;
    } catch (error) {
        console.error("Došlo je do greške:", error);
    }
 }

ucitajTekst();

Šta se ovde dešava?
   1️⃣ fetch("podaci.txt") šalje HTTP zahtev za učitavanje fajla.
   2️⃣ await response.text() čeka da se podaci preuzmu i konvertuju u tekst.
   3️⃣ Tekst se prikazuje u div elementu sa id="rezultat".


Zadatak 2️⃣ - Učitavanje tekstualnog fajla pomoću metode .get()
  1. Koristiti .get() metod jQuery biblioteke za učitavanje istog TXT fajla.
  2. Prvo raditi sa osnovnom sintaksom - bez bilo kakvih provera
  3. Dodati proveru da li je fajl učitan i promeniti naziv fajla. Šta se dešava?
  • Uočiti razliku u sintaksi i načinu obrade podataka kod ova dva naćina rada.
  • Uporediti rezultate ....

    🔹 Kao pomoć u radu pogledajte sledeći primer: učitavanje fajla podaci.txt pomoću metode .get()

🔹 Primer: Učitavanje podaci.txt pomoću metode .get()

 $(document).ready(function() {
    $.get("podaci.txt", function(data) {
        $("#rezultat").text(data);
    }).fail(function() {
        console.log("Došlo je do greške pri učitavanju fajla.");
    });
 });

Šta se ovde dešava?
1️⃣ $.get("podaci.txt", function(data) {...} – Asinhrono učitava fajl i prosleđuje sadržaj funkciji.
2️⃣ $("#rezultat").text(data) – Ubacuje tekst u HTML element.
3️⃣ Ako fajl ne postoji, ispisuje se greška.


Zadatak 3️⃣ - Učitavanje JSON fajla pomoću Fetch API-ja

  1. Napraviti JSON fajl (osobe.json) nekoliko podataka o različitim osobama.
    📂 Primer sadržaja fajla osobe.json
     {
        "ime": "Marko",
        "prezime": "Petrović",
        "godine": 25
     }
    
  2. Koristiti Fetch API da se taj fajl učita, i da se podaci za svaku od osoba prikažu u posebnom paragrafu.

Saveti za rad:  isti kao za prethodni primer ...
🔹 Kao pomoć u radu pogledajte sledeći primer: učitavanje fajla podaci.json pomoću Fetch API-ja

Ako fajl sadrži JSON podatke (podaci.json), možemo ga učitati i parsirati:


📂 Primer sadržaja fajla podaci.json
 {
    "ime": "Marko",
    "prezime": "Petrović",
    "godine": 25
 }

🔹 Kod za učitavanje JSON-a:

 async function ucitajJSON() {
    try {
        let response = await fetch("podaci.json");
        if (!response.ok) {
            throw new Error("Greška pri učitavanju fajla.");
        }
        let data = await response.json();
        document.getElementById("rezultat").innerText = `Ime: ${data.ime}, Prezime: ${data.prezime}, Godine: ${data.godine}`;
    } catch (error) {
        console.error("Došlo je do greške:", error);
    }
 }

ucitajJSON();

Šta se ovde dešava?
   1️⃣ fetch("podaci.json") učitava JSON fajl.
   2️⃣ await response.json() konvertuje podatke u JavaScript objekat.
   3️⃣ Prikazujemo podatke iz JSON-a u HTML-u.



Koju tehnologiju koristiti?
  • Ako učenici prvi put rade sa dinamičkim podacima → Fetch API (savremen i lako razumljiv).
  • Ako već znaju jQuery → AJAX sa jQuery (fleksibilan, ali manje potreban danas).
  • Ako samo treba brzo dohvatiti fajl → .get() (najkraći i najlakši način).


Od kada se ovo koristi:


AJAX - od 2007 u osnovnom obliku sa JavaScriptom - znači od pre 18 godina!
Fetch API - uveden 2015 godine kao modernija zamena za XMLHttpRequest (XHR).

Ključni momenti:
  • 2015 – Uveden Fetch API sa Promise baziranom sintaksom.
  • 2017ECMAScript 2017 (ES8) zvanično uvodi async i await.
  • 2017–2018 – Svi moderni pretraživači počinju da podržavaju async/await.
  • 2020+async/await postaje standardan način pisanja asinhronog JavaScript koda, uključujući fetch.

The fetch() method starts the process of fetching a resource from a server. The fetch() method returns a Promise that resolves to a Response object.

...

Last modified: Sunday, 2 March 2025, 6:15 PM