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]);
// 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]);
// 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():

  1. Po kliknięciu przycisku, wykonaj zapytanie do https://jsonplaceholder.typicode.com/posts, przekazując userId: 1 jako dane.
  2. 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():

  1. 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():

  1. Po kliknięciu przycisku, pobierz wartość ID posta z pola input.
  2. Wykonaj zapytanie GET do https://jsonplaceholder.typicode.com/comments, przekazując pobrane ID jako parametr postId w danych zapytania.
  3. Ustaw oczekiwany dataType na "json".
  4. W funkcji sukcesu, wyświetl listę (<ul>) treści komentarzy (body) w div-ie "lista-komentarzy".
  5. 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.