AJAX w nawigacji strony WWW

Jak wiadomo AJAX w systemie nawigacyjnym strony nie jest zalecany, ze względu na to że roboty wyszukiwarek takich jak Google mają problemy w poradzeniu sobie z indeksacją linków zapisanych jako kod JavaScript. Przez to automatycznie spada nasza pozycja w wynikach wyszukiwarek, większość treści naszej strony jest poza zasięgiem robotów i w konsekwencji mniej internautów do nas dociera. Jednak jest na to sposób, możemy nie ingerując w kod odnośnika do obsługi zdarzenia kliknięcia wykorzystać bezpośrednio JavaScript. W ten sposób zachowamy dobre zasady technik SEO. Dodatkowo nasz serwis będzie generować identyczne strony na przeglądarkach z włączonym lub wyłączonym JavaScript, z wł/wył ActiveX (przeglądarki IE), bez żadnych komunikatów o błędach. Czyli niezależnie czy klient obsługuje AJAX czy nie, uzyskamy bardzo podobne rezultaty. Oczywiście przeglądanie serwisu z włączonym JS (i w IE ActiveX) zdecydowanie poprawi szybkość i dynamiczność strony, ale odwrotna sytuacja wcale nie zakłóci pracy serwisu, a już na pewno, co wydaje się być najważniejsze, żaden z przypadków nie zakłóci indeksacji podstron przez wyszukiwarki. Wychodząc z zasady, że nie warto tworzyć czegoś co już istnieje, wykorzystamy skrypt JS AddEvent Manager autorstwa Angus Turnbull - www.twinhelix.com do obsługi zdarzeń. Skrypt korzysta z metod DOM takich jak addEventListener i removeEventListener, dzięki temu sami możemy tworzyć obsługę takich zdarzeń jak klikanie (co nas interesuje). Dodatkowo skrypt jest małych rozmiarów (około 1,4KB), więc można go zamieścić w kodzie źródłowym strony, lub dodać do jakiegoś naszego skryptu zewnetrznego. Raczej nie opłaca się tworzyć osobnego pliku (ze względu na “zaśmiecanie”). Autor skryptu udostępnia na swojej stronie również HTMLHttpRequest, demo tego skryptu działa podobnie do tego co chcemy osiągnąć w tym artykule, jednak na nasze potrzeby jest to rozwiązanie za mało elastyczne i niestety dodatkowo potrafi wykorzystywać pływające ramki, których my zamierzamy uniknąć. Dlatego do komunikacji z serwerem wykorzystamy inne rozwiązanie. Na razie jednak przyjrzyjmy się AddEvent Manager:

 Kod źródłowy: emg.jsAddEvent Manager 

Nie będe zagłębiał się w omówienie tych metod, bo nie to stanowi treść tego artykułu. Dlatego od razu przechodzimy dalej. Tworzymy serce naszego systemu czyli pliki nagłówka - inc.header.php i stopki - inc.footer.php. Dodatkowo plik index.php, który po prostu inkluduje nagłówek i stopkę oraz pliki w których będziemy przechowywać naszą treść czyli: aktualnosci.php, o_nas.php i kontakt.php. Oczywiście w realiach wcale nie musimy tworzyć takich plików możemy posłużyć się jednym plikiem index.php i tam zarządzać całą treścią pobieraną np. z bazy danych, wykorzystując czyste URLe po przez odpowiednie ustawienie serwera WWW (mod_rewrite). Na potrzeby artykułu pozostaniemy jednak przy takiej konfiguracji. Zobaczmy jak wyglądają poszczególne pliki.

 Kod źródłowy: index.php

 Kod źródłowy: inc.header.php

 Kod źródłowy: inc.footer.php

Mimo, że nagłówek jest dość dobrze opisany postaram się wyjaśnić kilka rzeczy. Korzystamy z kodowania znaków UTF-8 gdyż taka jest ostatnio tendencja, zresztą całkowicie uzasadniona. Do obsługi AJAXa wykorzystujemy bardzo fajny skrypt którego autorem jest Łukasz Lach, mianowicie AdvancedAJAX, opis na stronie http://advajax.anakin.us/, po zapoznaniu z dokumentacją gwarantuję że się spodoba ;) . Dodajemy obsługę zdarzenia “click”, filtrujemy wszystkie kliknięcia. Jeśli natrafimy na nasz element skojarzony z AJAXem po przez nazwę klasy znacznika “a”, mianowicie musi być to klasa o nazwie LinkAJAX-WarstwaDocelowa wywołana zostanie funkcja loadInto(), która korzystając z advAJAX wczyta żądaną stonę określoną w atrybucie “href” znacznika “a”, dodając do niej parametr AJAXOK=1. Ponieważ advAJAX działa asynchronicznie, nie jesteśmy w stanie zablokować przeładowania strony w reakcji na to czy skrypt załadował treść, dlatego sprawdzamy po prostu czy klient może obsłużyć AJAX. Jeśli tak to blokujemy przeładowanie strony. Jeśli nie to pozwalamy na przeładowanie (tak jak by w ogóle tego JavaScript’u nie było). Każda z podstron wygląda podobnie, dlatego pokażę kod jednej z nich.

 Kod źródłowy: kontakt.php

Jak widać do pliku dołączany jest nagłówek i stopka jeśli w żadaniu GET nie występuje parametr AJAXOK - czyli jeśli treść nie jest pobierana za pośrednictwem AJAX, co powoduje że strona w każdym przypadku wygląda tak samo. I to jest cała filozofia działania. Jak się przekonamy jeśli klient korzysta z AJAX to możemy również w bardzo ładny sposób obsługiwać i reagować na błędy HTTP (np. pisząc dodatkową funkcję JS do obsługi błędów o konkretnych numerach), co pokazane jest w demonstracji, bez AJAX nie moglibyśmy tak reagować. Wystarczy pobawić się poziomem bezpieczeństwa w Internet Explorer (jeśli ktoś posiada ;-) ) i na pewno zauważymy różnice. Dzięki advAJAX możemy też w łatwy sposób np. informować, że właśnie ładujemy jakieś dane (przydatne przy cięższych plikach) - po szczegóły odsyłam do dokumentacji na stronie skryptu. Zapraszam do eksperymentowania.

DEMONSTRACJA

AJAX w nawigacji WWW (ZIP)



dodajdo.com

14 komentarzy do “AJAX w nawigacji strony WWW”

  1. Xsi:

    Nameczyles sie. Ale wszystko napisane przejrzyscie i przystepnie.
    Komentarzy malo ale podejrzewam, ze wiecej czytelnikow mogl bys zdobyc majac bloga w jakims blogowym serwisie (moze jakis techblogowy) a nie u siebie na koncie.

  2. dabek:

    No bez przesady blogi !!! Trzeba szukać interesujących rzeczy i je znajdować ,szczerze jak widzę w linku coś co wszuje na bloga to nie wchodzę

  3. Axel:

    W zasadzie nie promowałem tego bloga i nie zamierzam. Najpierw chce uzbierać trochę wpisów i zmienić adres na krótszy. Blogroll i wpisy do katalogów na pewno sporo dadzą, ale jeszcze czas na to. Poza tym cieżko mi określić kategorię tego bloga, bo w zasadzie pisze o swoich zainteresowaniach, a te są bardzo rozległe - jeszcze kilka działów na pewno się pojawi.

  4. eddy:

    Fajna sprawa z tym menu. Na pewno wypróbuję.

  5. felippe:

    A jakby jeszcze jako dodatek pojawiło się omówienie tego emg.js to już w ogóle byłoby super :D

  6. kaczor:

    Szkoda tylko, że przy przesyłaniu linków np. osobie do danego artykułu lub podstrony np. kontakt to i tak znajdziemy się na stronie głównej. Czy jest sposób, aby rozwiązać ten problem?

  7. Grzesiek:

    Jeśli chodzi o podmianę adresu w pasku URL - nie ma takiej opcji.

    Widzę 2 rozwiązania:

    Stworzyć użyteczną opcję prześlij link/stronę znajomemu, kopiuj adres czy coś takiego i tam adres zawarty w href linku.

    Wykorzystać kotwice czyli “#kotwica” w linku w href. Tylko tutaj obsługa musiałaby być zapewniona przez javascript, ponieważ sama kotwica nie jest przekazywana w żądaniu na serwer. Poza tym wymagałoby to wprowadzenia dalszych rozwiązań (np. takich żeby link dalej był indeksowany - blokowanie żądania kliknięcia, podmiana adresu linku na kotwice, wymuszenie żądania już z kotwicą).

  8. Oli:

    Jeszcze jakbyś powiedział jak zrobić, żeby na początku automatycznie ładował się jakiś plik jako start byłoby bardzo fajnie :)

  9. Tom:

    A co zobić żeby inne skrypty jquery np do menu działały na stronie, zbudowanej na tej podstawie, na ie wszystko ok zas na firefoksie oraz na operze menu nie działa….

  10. Grzesiek:

    Przede wszystkim unikamy konfliktów http://docs.jquery.com/Using_jQuery_with_Other_Libraries
    a jak juz korzystamy z jQuery, to mozemy sobie darowac rozwiazania z 2006 roku ;)
    Wyrzucamy skrypty JS podane wyżej, a skrypt w sekcji head zastepujemy:

    
    <script type="text/javascript">//<![CDATA[
    
    function loadInto(src, destId)
    {
    	$.ajax({
    	  url: src,
    	  type: "GET",
    	  data: "AJAXOK=1",
    	  success: function(data){
    		$(destId).html(data);
    	  },
    	  error: function(xhr, statusText, err) {
    		$(destId).html("Blad "+statusText+" "+err);
    	  }
    	});
    });    
    
    $(document).ready(function()
    {
          t="LinkAJAX-targetArea";
    
          $("."+t).click(function ()
           {
              loadInto($(this).attr('href'),
                      '#'+t.substr(t.indexOf('-')+1));
    	  return false;
           });
    }); 
    
    //]]></script>
    
    

    i to wszystko.
    Oczywiście pamiętamy o dołączeniu biblioteki jQuery.

  11. Toman:

    Hej !!
    Dzięki za pomoc, wszystko działa super:)

  12. Adam:

    Czy jest jakis sposob, aby juz domyslnie jedna z podstron byla wczytana? Tzn. przypuscmy ze standardowo otwierajac stronke byla wczytana juz podstrona Aktualnosci i po kliknieciu na inny link w menu zmieniala sie zawartosc?

  13. Grzesiek:

    Nie wiem czy o to chodzi. Po pierwsze mozna w warstwie docelowej (DIV) wpisac cokolwiek, bedzie widoczne dopoki nie kliknie sie na linki.

    Po drugie mozna tez po zaladowaniu dokumentu, do warstwy docelowej wpisac dowolna tresc korzystajac z AJAXa, wystarczy dodac linijke do bloku

    $(document).ready(function() {
    
         loadInto("aktualnosci.html", "#targetArea");
    
    });
    
  14. Adam:

    dzieki wielkie:)

Skomentuj