Odśwież zawartość strony automatycznie co określony czas – jQuery
Jeśli chcesz odświeżyć stronę albo jej część co x sekund, potrzebujesz tylko trochę javascriptu. Przedstawię kilka podstaw za pomocą jQuery
Najważniejsza funkcja/metoda
setInterval(function,milisekundy,język);
To podstawowa metoda javascriptu, która pozwala na wywołanie jakiejś funkcji co każde x milisekund. Można o tym przeczytać więcej na stronie w3schools.com
Będę ją wykorzystywać we wszystkich moich przykładach. Pierwsze dwa parametry są wymagany, a trzeci opcjonalny. Pamiętaj że 1s = 1000ms.
Dla przykładu, jeśli chcę wywołać funkcję moja_funkcja() co 5 sekund (5 sekund * 1000 = 5000ms) wystarczy, że napiszę tak:
setInterval("moja_funkcja();",5000);
Odświeżanie całej strony
Czasem potrzebujemy odświeżyć całą stronę. Nie jest to teraz zbyt powszechne ponieważ nie jest to najlepsze dla wydajności (choć wszystko zależy od kontekstu i gdzie to zastosujemy), ale należy o tym wpsomnieć. Tak więc aby odświeżyć stronę co 5 sekund nasz kod wyglądałby tak:
<script type="text/javascript">
setInterval("moja_funkcja();",10000);
function moja_funkcja(){
window.location = location.href;
}
</script>
Odświeżanie fragmentu strony
Jeśli potrzebujesz odświeżyć zawartość jakiegoś div-a na stronie, możesz użyć funckji load() z jQuery.
$('#id_do_odswiezenia').load('twoj_adres_www #id_ladowanej_tresci');
Dla lepszego zrozumienia spójrz na przykład poniżej:
<html> <head> <script src="http://code.jquery.com/jquery-latest.js"> <script type="text/javascript"> setInterval("moja_funkcja();",5000); function moja_funkcja(){ $('#odswiez').load(location.href + ' #czas'); } </script> </head> <body> <div id="odswiez"></div> <div id="czas"> <?php echo date('H:i:s');?> </div> </body> </html>
Można zauważyć że co 5 sekund div o id=”odswiez” jest aktualizowany. Oczywiście nasze divy w hml-u mogą wyglądać tak:
<div id="odswiez"> <div id="czas"> <?php echo date('H:i:s');?> </div> </div>
Użyłam dwóch osobnych kontenerów, aby widoczne były zmiany i działanie funkcji. Można oczywiście wpisać adres innej strony, albo wysłać jakieś dane, jednak to jest częściej wykorzystywane podczas interakcji z użytkownikiem, a nie przy automatycznym odświeżaniu.
Jeśli chcesz zobaczyć coś jeszcze bardziej skomplikowanego, zobacz część drugą automatycznego odświeżania ajaxem.
To jak odświeżamy stronę index.php, a w niej jest skrypt PHP to ten skrypt ponownie się wykona?? I drugie – gdzie w skrypcie “Odświeżanie całej strony” muszę wpisać linka swojej strony?? Jeśli tak to gdzie, jeśli nie to super. Jestem z JS i jQuery itd. ciemny, a potrzebuję czegoś takiego.
Działa tylko wyświetlenie daty w PHP, ale nie zmienia się ona co 1 sekundę (1000 ms)…
Wszystko niby pięknie, ale nie działa mi:
setInterval(“moja_funkcja();”,1000);
function moja_funkcja(){
$(‘#odswiez’).load(location.href + ‘ #czas’);
}
Jakiś pomysł?
Jeśli komuś z Was nie działa to sprawdźcie czy macie kod poprawnie wpisany na początku
<script type="text/javascript" src="jquery.js"></script> mi nie działało ale opamiętałem się ;) i działa ;) Dzięki za skrypcik
Nie wiem dlaczego ale chodzby czysty przykład z odswiezaniem godziny co 5 sekund mi nie działa, Jakis pomysł jaki moze byc problem ?
Wszystko jest dla ludzi byle z umiarem i rozsądkiem. Oczywiste jest, że takiego automatycznego odświeżania nie powinno stosować się dla całej strony, a tylko jej fragmentu, który zmienia się co jakiś czas. Zazwyczaj są to jakieś widgety, które i tak trudne są, a czasem niemożliwe do pozycjonowania.
A jak się zapatruje w takie rozwiązanie Google? czy czasem nie jest to łamanie jakichś wytycznych ? ale myślę, że nie choć nie sprawdzałem tego dokładnie.
No tak, już łapie. Dzięki wielkie
To jest dokładnie to o czym mówię :o) Nie widzisz tego, ale jak zobaczysz odpowiedź zapytania (np. firebug czy narzedzia developerskie w chrome) to jest pełen kod html. Czyli robisz zapytanie dla całej strony a jQuery tylko sprytnie wyciąga #obszar który jest Ci potrzebny. Pomimo tego, że wygląda to jakby odświeżany był tylko fragment strony, odświeżasz ją całą. Żeby captcha się nie zmieniła, musisz stworzyć osobny url do wyciągnięcia samych komentarzy.
function zaladuj(){
$('#odswiez').load(' #obszar');
}
ładuje tylko obszar, w którym jest treść do przeładowywania. I dla tego się zdziwiłem że captche tez odświeża
A jaki url wywołujesz przy tym odświeżeniu? Bo uwaga, jeśli korzystasz z zapisu $('#id_do_odswiezenia').load('twoj_adres_www #id_ladowanej_tresci'); ze wskazaniem id na końcu, to de facto ładujesz całą stronę, łącznie z nagłówkami <head> etc. jQuery po prostu z odpowiedzi wyciąga to #id_ladowanej_tresci. Więc jeśli załadowana jest cała strona i były tam jakieś funkcje po stronie serwera typu ustawienie captchy to również to się wykona/ustawi/zapisze w sesji etc. Stąd kwestia o dedykowanym url do wyciągnięcia samych komentarzy, żeby właśnie jakieś sesyjne pierdoły nie nadpisały sie/zmieniły podczas ajaxowego zapytania. Jeśli nadal nie oto chodzi musiałabym zobaczyć jakiś kod, żeby nie wróżyć z fusów ;o)
hmmm trochę źle zadałem pytanie:) ale dla tego, że prawie weekend:D Chodzi o to, że drugi skrypt teoretycznie powinien odświeżać tylko część strony o odpowiednim id. I tak w rzeczywistości jest, ale komentarze które mam pod tym divem, a raczej captche która jest w nich też ładuje.
grzes,
przygotuj dedykowany url do pobrania samych komentarzy. Zamiast odświeżać całą stronę po prostu zrób $('#odswiez').load(adres_url_ktory_pobiera_same_komentarze); Tam możesz dodać warunek który sprawdza czy jest to zapytanie ajaxowe, żeby działał tylko dla zapytań ajaxowych i problem z głowy.
Wszystko super, ale mam pytanie. Na stronie mam mam umieszczone komentarze zabezpieczone captcha i nie mogę dodać komentarza bo co 5sek nowa captcha się ładuje. Jak mogę rozwiązać taki problem ?
Krzysiek,
oczywiście masz rację. Piszę o tym na samym początku: "To podstawowa metoda javascriptu [..]".
Natomiast .load() – jest funkcją jQuery.
setInterval – to jest funkcja JavaScript, nie potrzeba jQuery.