Lekcja 14: AJAX w jQuery - Metody Skrótowe ($.get()
, $.post()
, $.getJSON()
, $.getScript()
, .load()
)
Oprócz wszechstronnej metody $.ajax()
, jQuery oferuje kilka wygodnych metod skrótowych do wykonywania najczęstszych typów zapytań AJAX. Upraszczają one kod, gdy nie potrzebujemy pełnej konfiguracji dostępnej w $.ajax()
.
Metoda $.get()
Służy do wykonywania zapytań HTTP GET. Jest to skrót dla $.ajax()
z method: "GET"
.
Składnia:
$.get(url, [dane], [funkcjaSuccess], [dataType]);
url
: Adres URL do zapytania.dane
(opcjonalne): Obiekt lub string z danymi do wysłania jako query string.funkcjaSuccess(data, textStatus, xhr)
(opcjonalne): Funkcja zwrotna wywoływana po sukcesie.dataType
(opcjonalne): Oczekiwany typ danych (np. "json", "html", "text").
// Pobierz dane HTML i wstaw do diva
$("#laduj-html").on("click", function() {
$.get("/fragmenty/naglowek.html", function(htmlData) {
$("#kontener-naglowka").html(htmlData);
}, "html");
});
// Pobierz dane JSON z parametrami
$.get("/api/szukaj", { termin: "jQuery", strona: 1 }, function(wyniki) {
console.log("Znaleziono:", wyniki);
}, "json");
Metoda $.post()
Służy do wykonywania zapytań HTTP POST. Skrót dla $.ajax()
z method: "POST"
.
Składnia:
$.post(url, [dane], [funkcjaSuccess], [dataType]);
Argumenty są takie same jak w $.get()
, ale dane
są wysyłane w ciele zapytania POST.
// Wyślij dane formularza
$("#formularz-rejestracji").on("submit", function(e) {
e.preventDefault();
let dane = $(this).serialize();
$.post("/api/rejestracja", dane, function(odpowiedz) {
if (odpowiedz.sukces) {
alert("Rejestracja udana!");
} else {
alert("Błąd: " + odpowiedz.wiadomosc);
}
}, "json");
});
Metoda $.getJSON()
Specjalizowany skrót do pobierania danych w formacie JSON za pomocą zapytania GET. Automatycznie ustawia dataType: "json"
.
Składnia:
$.getJSON(url, [dane], [funkcjaSuccess]);
// Pobierz listę użytkowników
$("#pobierz-uzytkownikow").on("click", function() {
$.getJSON("https://jsonplaceholder.typicode.com/users", function(users) {
let lista = "";
users.forEach(user => lista += `- ${user.name}
`);
lista += "
";
$("#lista-uzytkownikow").html(lista);
});
});
Metoda $.getScript()
Pobiera plik JavaScript z serwera za pomocą zapytania GET, a następnie go wykonuje.
Składnia:
$.getScript(url, [funkcjaSuccess]);
// Załaduj i wykonaj dodatkowy skrypt na żądanie
$("#laduj-walidacje").on("click", function() {
$.getScript("/js/walidacja-formularza.js", function() {
console.log("Skrypt walidacji załadowany i wykonany.");
// Można teraz użyć funkcji z załadowanego skryptu
if (typeof inicjalizujWalidacje === "function") {
inicjalizujWalidacje();
}
});
});
Metoda .load()
Ta metoda różni się od poprzednich – jest wywoływana na obiekcie jQuery (wyniku selektora) i służy do ładowania fragmentu kodu HTML z serwera i wstawiania go bezpośrednio do wybranych elementów.
Składnia:
$(selektor).load(url, [dane], [funkcjaComplete]);
url
: Adres URL, z którego ma być pobrany HTML. Można dodać selektor po spacji (np."/strona.html #tresc"
), aby załadować tylko określony fragment strony.dane
(opcjonalne): Obiekt lub string z danymi. Jeśli podane, jQuery wykona zapytanie POST, w przeciwnym razie GET.funkcjaComplete(responseText, textStatus, xhr)
(opcjonalne): Funkcja zwrotna wywoływana po zakończeniu zapytania i wstawieniu treści.
// Załaduj stopkę strony do diva #stopka
$("#stopka").load("/fragmenty/stopka.html");
// Załaduj tylko listę produktów z innej strony
$("#lista-produktow").load("/produkty/wszystkie.html #produkty-lista ul");
// Załaduj komentarze dla posta o ID 5 (wysyłając ID jako POST)
$("#komentarze-post-5").load("/api/komentarze", { postId: 5 }, function(response, status, xhr) {
if (status == "error") {
$(this).html("Błąd ładowania komentarzy: " + xhr.statusText);
}
});
Ograniczenia Metod Skrótowych
Metody skrótowe nie oferują tak wielu opcji konfiguracji jak $.ajax()
. W szczególności, nie mają bezpośredniego odpowiednika dla callbacków beforeSend
czy error
(chociaż można użyć globalnych handlerów AJAX lub nowszych metod .done()
, .fail()
, .always()
zwracanych przez te metody - patrz kolejna lekcja).
Zadanie praktyczne
Użyj API JSONPlaceholder (https://jsonplaceholder.typicode.com/posts?userId=1
), aby pobrać posty użytkownika o ID 1.
Stwórz plik HTML z przyciskiem "Pobierz Posty" i pustym div-em z ID "lista-postow".
Używając metody $.getJSON()
:
- Po kliknięciu przycisku, wykonaj zapytanie do
https://jsonplaceholder.typicode.com/posts
, przekazującuserId: 1
jako dane. - W funkcji zwrotnej (success), wygeneruj listę (
<ul>
) tytułów (title
) postów i wstaw ją do diva "lista-postow".
Następnie dodaj drugi div z ID "zawartosc-pliku" i przycisk "Załaduj Plik". Stwórz prosty plik tekstowy test.txt
w tym samym katalogu co plik HTML, zawierający kilka linijek tekstu.
Używając metody .load()
:
- Po kliknięciu przycisku "Załaduj Plik", załaduj zawartość pliku
test.txt
do diva "zawartosc-pliku".
Pokaż rozwiązanie
HTML:
<!DOCTYPE html>
<html>
<head>
<title>Test Metod Skrótowych AJAX</title>
</head>
<body>
<h2>Posty Użytkownika 1</h2>
<button id="pobierz-posty">Pobierz Posty</button>
<div id="lista-postow" style="margin-top: 10px; border: 1px solid #ccc; padding: 10px; min-height: 50px;">
<!-- Tutaj pojawią się posty -->
</div>
<h2 style="margin-top: 20px;">Zawartość Pliku</h2>
<button id="zaladuj-plik">Załaduj Plik</button>
<div id="zawartosc-pliku" style="margin-top: 10px; border: 1px solid #ccc; padding: 10px; min-height: 50px; white-space: pre-wrap;">
<!-- Tutaj pojawi się zawartość pliku -->
</div>
<!-- Plik test.txt w tym samym katalogu -->
<!-- Zawartość test.txt:
Linia pierwsza.
Druga linia tekstu.
I jeszcze jedna linia.
-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
$(function() {
// Obsługa $.getJSON()
$("#pobierz-posty").on("click", function() {
$("#lista-postow").html("Ładowanie...");
$.getJSON("https://jsonplaceholder.typicode.com/posts", { userId: 1 }, function(posts) {
let listaHtml = "";
posts.forEach(function(post) {
listaHtml += `- ${post.title}
`;
});
listaHtml += "
";
$("#lista-postow").html(listaHtml);
}).fail(function() { // Obsługa błędu dla $.getJSON
$("#lista-postow").html("<p style=\'color: red;\'>Błąd pobierania postów.</p>");
});
});
// Obsługa .load()
$("#zaladuj-plik").on("click", function() {
// Upewnij się, że plik test.txt istnieje w tym samym katalogu co HTML
$("#zawartosc-pliku").load("test.txt", function(response, status, xhr) {
if (status == "error") {
$(this).html("Błąd ładowania pliku: " + xhr.statusText);
}
});
});
});
</script>
</body>
</html>
Zadanie do samodzielnego wykonania
Użyj API JSONPlaceholder dla komentarzy (https://jsonplaceholder.typicode.com/comments
).
Stwórz pole input (type="number"
) do wpisania ID posta oraz przycisk "Pobierz Komentarze". Dodaj div z ID "lista-komentarzy".
Używając metody $.get()
:
- Po kliknięciu przycisku, pobierz wartość ID posta z pola input.
- Wykonaj zapytanie GET do
https://jsonplaceholder.typicode.com/comments
, przekazując pobrane ID jako parametrpostId
w danych zapytania. - Ustaw oczekiwany
dataType
na"json"
. - W funkcji sukcesu, wyświetl listę (
<ul>
) treści komentarzy (body
) w div-ie "lista-komentarzy". - Dodaj prostą obsługę błędu, np. używając
.fail()
po wywołaniu$.get()
, aby wyświetlić komunikat w razie problemów.
FAQ - Metody Skrótowe AJAX jQuery
Kiedy używać metod skrótowych, a kiedy $.ajax()
?
Metod skrótowych ($.get
, $.post
, $.getJSON
, .load
) używaj do prostych, typowych zapytań GET/POST lub ładowania HTML, gdy nie potrzebujesz zaawansowanej konfiguracji. Użyj $.ajax()
, gdy potrzebujesz pełnej kontroli, np. ustawienia niestandardowych nagłówków, obsługi różnych metod HTTP (PUT, DELETE), ustawienia timeoutu, czy szczegółowej obsługi błędów za pomocą callbacków error
, beforeSend
, complete
.
Jak obsłużyć błędy w metodach skrótowych?
Metody $.get()
, $.post()
, $.getJSON()
i $.getScript()
zwracają obiekt jqXHR (superset obiektu XMLHttpRequest), który implementuje interfejs Promise. Możesz dołączyć do niego metody .done()
(sukces), .fail()
(błąd) i .always()
(zawsze), np. $.getJSON(...).done(funkcjaSukces).fail(funkcjaBlad);
. Metoda .load()
ma opcjonalny callback complete
, który otrzymuje status zapytania.
Czy .load()
wykonuje skrypty z załadowanego HTML?
Domyślnie .load()
usuwa tagi <script>
przed wstawieniem HTML do DOM i ich nie wykonuje. Aby wykonać skrypty, musisz użyć innych metod, np. pobrać HTML za pomocą $.get()
, wstawić go ręcznie i następnie znaleźć i wykonać skrypty.
Czy mogę użyć .load()
do ładowania danych z innej domeny?
Nie, ze względu na ograniczenia Same-Origin Policy przeglądarki, metoda .load()
może ładować dane tylko z tej samej domeny, z której pochodzi strona. Do komunikacji między domenami należy używać $.ajax()
(jeśli serwer docelowy wspiera CORS) lub technik takich jak JSONP (dla zapytań GET).
Jaka jest różnica między $.get()
a $.getJSON()
?
$.getJSON(url, data, success)
jest równoważne $.get(url, data, success, "json")
. Jest to po prostu wygodniejszy skrót, gdy wiesz na pewno, że oczekujesz odpowiedzi w formacie JSON.