Jak wyświetlać żądania Ajax w adresie URL?

Chcę mieć linki, które zmieniają część strony i dynamiczny adres URL do niej, Gdzie mogę określić zmienne takie jak #calendar=10_2010tabview=tab2

Check this for an exact example: KLIKNIJ TUTAJ, ABY ZOBACZYĆ DEMO EXACT

Oto format linku, którego potrzebuję:

#calendar=10_2010&tabview=tab2

Muszę mieć zmienne w linkach, takich jak calendar i tabview, więc mogę zmienić wiele rzeczy na jednej stronie bez realoading.


Lub inny format taki jak na http://www.wbhomes.com.au, to jest dokładnie to czego chcę, jednak pierwszy format też jest dobry, ale ten jest o wiele piękniejszy.

  • http://wbhomes.com.au/#/propertiesforsale/houseandland/quinnsbeach-waterland1

Wymagania

  • Musi być dostępny z dowolnego miejsca z przykładowego maila, lub jeśli tylko wpisz w pasku adresu url.

  • Link powinien być w historii, więc jeśli nacisnę przycisk Wstecz lub do przodu strona musi być dostęp.

  • Odświeżanie strony też musi działać.


Niektóre źródła:

Przykłady:

Niektóre Tutoriale:


proszę, pomóż mi! Nigdy nie znalazłem takiego rozwiązania, ale nie chcę używać jquery ani żadnego API, ani żadnej biblioteki, chcę mieć działający skrypt Javascript/AJAX i PHP.

Author: Adam, 2010-07-08

7 answers

W przypadku dema związanego z twoim pytaniem, osiągnięcie tej funkcjonalności jest naprawdę bardzo proste - ponieważ w ogóle nie używa Ajaksa(gdy zaczniesz dodawać AJAX do miksu, staje się trudniejsze - wyjaśnione później). Aby osiągnąć tę funkcjonalność, należy uaktualnić łącza, aby używały skrótów, a następnie powiązać je ze zdarzeniem hashchange. Niestety wydarzenie hashchange nie jest kompatybilne między przeglądarkami, choć na szczęście istnieje wiele "historii/wtyczek zdalnych" dostępnych - nasz preferowany nad lata okazały się Historia jQuery, jest open-source, ma świetne wsparcie i jest aktywnie rozwijany :-).

Chociaż jeśli chodzi o dodawanie funkcjonalności AJAX do mixu jak takie strony jak Facebook, WBHomes i Balupton.com wtedy będziesz musiał zmierzyć się z całą serią poważnie trudnych problemów! (Wiem, że byłem głównym architektem dwóch ostatnich miejsc!). Niektóre z tych problemów to:

  • Jak z wdziękiem i łatwością uaktualnić Niektóre linki wewnętrzne do korzystania z historii i funkcji AJAX, i wykryć, kiedy hash się zmienił? utrzymując inne linki działające tak jak wcześniej.
  • jak przekierować z "www.yoursite.com/myapp/a/b/c" do "www.yoursite.com/myapp/#/a/b/c"? i nadal utrzymuj płynność dla użytkownika, tak aby niezbędne przekierowania 3 były tak płynne, jak to możliwe.
  • Jak przesyłać wartości formularzy i dane za pomocą AJAX i aktualizować hash? i odwrotnie, jeśli nie wspierają Javascript.
  • Jak wykryć, którego konkretnego obszaru strony żąda AJAX? Takie, aby podstrony były wyświetlane z poprawną stroną.
  • Jak zmienić tytuł strony, gdy zmieni się stan AJAX? i innych treści nie będących stroną.
  • Jak wykonać ładne efekty intro/outro podczas gdy stan AJAX ładuje się i zmienia? tak, że użytkownik nie jest pozostawiony w ciemności.
  • Jak zaktualizować dane logowania na pasku bocznym, gdy logujemy się przez AJAX? Jak widać nie chcemy tego przycisk logowania w lewym górnym rogu, aby już tam być.
  • jak nadal wspierać stronę dla użytkowników, którzy nie mają włączonego JS? Tak, że z wdziękiem degraduje się i nadal jest indeksowany przez wyszukiwarki.

Jedyny znany mi projekt open-source, który próbuje rozwiązać wszystkie te niezwykle trudne problemy, okazał się być jQuery Ajaxy. Jest to skutecznie rozszerzenie do wspomnianego wcześniej projektu historii jQuery, zapewniając miłą elegancki interfejs wysokiego poziomu, aby dodać funkcjonalność AJAX do miksu, aby zająć się tymi trudnymi problemami za kulisami, więc nie musimy się nimi martwić. Jest to również wybrane rozwiązanie stosowane w kilku ostatnich witrynach komercyjnych wymienionych wcześniej.

Powodzenia, a jeśli masz jeszcze jakieś pytania to po prostu napisz komentarz do tej odpowiedzi, a ja zajmę się tym jak najszybciej: -)

Aktualizacja: istnieje teraz HTML5 Historia API (pushState, popState), który deprecates HTML4 hashchange funkcjonalność. Historia.js jest obecnie sucessorem historii jQuery i zapewnia kompatybilność między przeglądarkami dla interfejsu API historii HTML5 i opcjonalnego hashchange alternatywa dla przeglądarek HTML4. jQuery Ajaxy zostanie zaktualizowany do historii.js

 25
Author: balupton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-26 23:18:02

Myślę, że możesz to zrobić bardzo łatwo używając zdarzenia onHashChange obecnego w HTML5 lub używając biblioteki JavaScript, która emuluje zachowanie "hash" w przeglądarkach, które nie mają pełnej obsługi HTML 5. Jedną z takich bibliotek może być MooTools onhashchange, ale jest też wiele innych.

Niż Jeśli masz przeglądarkę HTML 5 lub taką bibliotekę, która emuluje zachowanie, po prostu użyj:

window.sethash("#newsection");
aby zmienić na coś nowego z javascript i / lub wywołanie zwrotne do tego Zdarzenie onHashChange, aby go przechwycić, w zależności od scenariuszy przypadków użycia.
 1
Author: Adrian A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 21:10:22

Cormvc jQuery Framework jest zrobiony w ten sposób, to jest opensource można kopać w źródle i uzyskać logikę z niego.

I właściwie to jest całkiem prosto do przodu. Twórca mówi to ładnie na tym filmie poniżej.

http://www.bennadel.com/resources/jing/2009-12-21_0933.swf

PS sorry can 't post second link bc i' m a new user.

 1
Author: KakambaWeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 21:30:58

Szewasz.. :)

HTML

<a href="/bye.php?user=abc&page=messages" 
   onclick="return goToWithAjax(this);">bye</a> 

Javascript

function goToWithAjax(hash) {
  hash = hash.href ? hash.getAttribute("href", 2) : hash;
  ajax( hash, function( response ) {
    document.getElementById("content").innerHTML = response;
  });
  hash = ("#!/" + hash).replace("//","/");
  window.location.hash = hash;
  return false;
}

//////////////////////////////////////////////////////////////////////////////

function getXmlHttpObject() {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

function ajax(url, onSuccess, onError) {
    var xmlHttp = getXmlHttpObject();
    xmlHttp.onreadystatechange = function () {
        if (this.readyState == 4) {
            // onError
            if (this.status != 200) {
                if (typeof onError == 'function') {
                    onError(this.responseText);
                }
            }
            // onSuccess
            else if (typeof onSuccess == 'function') {
                onSuccess(this.responseText);
            }
        }
    };
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    return xmlHttp;
}​
 1
Author: galambalazs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-23 14:16:54

Jest to coś, co wymyka się większości nowych programistów AJAXian. Jest to jednak dość prosty problem do rozwiązania.

Pierwszą rzeczą, której potrzebujesz, jest rdzeń jQuery, który jest darmowy w jquery.com

Następnie będziesz potrzebował wtyczki jQuery hash change even autorstwa Ben Alman, którą znajdziesz tutaj: http://benalman.com/projects/jquery-hashchange-plugin/ nie będzie to potrzebne dla nowszych wersji przeglądarek, które obsługują Zdarzenie hashchange html5, ale będzie dla starszych wersji przeglądarki. nie musisz nic robić, ale włącz ten skrypt na swojej stronie, obsługuje resztę.

Teraz dla twoich linków będziesz musiał skonstruować je w postaci łańcucha zapytania w następujący sposób:

<a href="user.php?q=/topic/article" class="dynlnk">Link Text/Image</a>

Teraz masz linki, które prowadzą do stron i mogą być obsługiwane w php w przypadku, gdy javascript jest wyłączony. wszystko, co musisz zrobić, to użyć super global $_GET i przetworzyć ciąg zapytania do obsługi zawartości strony.

Teraz w Twoim javascript na stronie będziesz musiał wyzwalać linki hashchange. Możesz to zrobić, zastępując ?q = z # w ten sposób.

$(".dynlnk").each(function(){
    $(this).attr("href", $(this).attr("href").replace("?q=", "#"));
});

Teraz Twoje linki wyzwalają hashchange, jedyne, co pozostało, to powiązać hashchange z funkcją, która coś robi. Można to zrobić bardzo prosto z jQuery w ten sposób:

$(window).bind( 'hashchange', function(e){

    //this splits the part after the hash so you can handle the parts individually.
    //to handle them as one just use location.hash
    pageparts = location.hash.split("/");

});

Teraz po prostu dodaj co kiedykolwiek kod zrobić, aby obsłużyć ajax i treści.

Teraz wystarczy jeden ostatni bit javascript, aby uruchomić hashchange w przypadku, gdy strona została załadowana z hash na początek, więc po prostu wywołaj funkcję Windows trigger, gdy Strona się ładuje

$(window).trigger( 'hashchange' );

Mam nadzieję, że jest to wystarczająco jasne, jeśli nie, nie wahaj się ze mną skontaktować, aby zadać więcej pytań.

 0
Author: Kelly Copley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 15:46:51

Korzystanie z łączy hashowych pozwala na bookmarkable/sharable linki do wyzwalania kodu JavaScript, zamiast przeładowywania strony. Ben Almans jQuery hashchange event pozwala powiązać obsługę zdarzenia z wydarzeniem hashchange, ta wtyczka działa ze starszymi przeglądarkami, które normalnie tego nie obsługują. Obsługa zdarzenia powiązana z hashchange może odczytać część skrótu adresu url i wywołać dowolną funkcję.

// register event handler
function bindHashchange() {

    $(window).bind('hashchange', function(event) {
        event.preventDefault();
        var label = location.hash.substring(1);
        handleLabel(label);
    });

    // trigger event so handler will be run when page is opened first time
    // otherwise handler will only run when clicking on hash links
    $(window).trigger('hashchange');
}

// read and handle hash part of url
function handleLabel(label) {

    if ( label.length > 0 ) {
        // using label from url
        switchPage(label);
    } else {
        // use the default label, if no hash link was present
        switchPage('start');
    }
}

// in this case, load hidden <div>'s into a <div id="content">
function switchPage(label) {
    if ( label == 'start ) {
        $('div#content').html($('div#start'));
    } else if ( label == 'some_other_page' ) {
        // do something else
    }
}

Ten inny mechanizm obsługi zdarzenia może przetwarzać 2 argumenty oddzielone kropką ('.") w tym samym url.

function processHash() {

    var str = location.hash.substring(1);
    var pos = $.inArray('.', str);

    var label = '';
    var arg = '';

    if ( pos > -1 ) {
        label = str.substring(0, pos);
    } else {
        label = str.substring(0);
    }

    if ( pos > 1 ) {
        arg = str.substring(pos+1);
    }

    if ( label.length == 0 ) {
        // the default page to open of label is empty
        loadContent('start');
    } else {
        // load page, and pass an argument
        loadContent(label, arg);
    }
}

Jeśli używane są wyrażenia regularne, można przetwarzać dowolną kombinację znaków.

var registry = {};

// split on character '.'
var args = label.split(/\./g);

for ( i in args ) {
    var arg = args[i];

    // split on character '='
    var temp = arg.split('=');
    var name = temp[0];
    var value = temp[1];

    // store argument in registry
    registry[name] = value;
}
// registry is loaded, ready to run application that depends on arguments

Spowoduje to przekształcenie adresu url:

Mysite/ # firma.page = items.color = red

Do następującego obiektu JavaScript:

Object { company = undefined, page = "items", color = "red"}

Wtedy jest tylko kwestia uruchomienia funkcji show() lub hide() jQuery na wybranych elementach.

To może być przekształcone w JavaScript non-jQuery, ale wtedy stracisz funkcjonalność, którą dostarcza Ben Alman, co jest kluczowe dla przenośnego rozwiązania.

 0
Author: thnee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-23 00:44:39

To, czego potrzebujesz, to sposób na obsługę historii w AJAX, co można zrobić za pomocą wielu już istniejących bibliotek. Polecam lekturę YUI 3 strony o historii .

 0
Author: Jungle Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 03:47:50