Uniwersalnych sposobów na przekierowanie klienta z jednej podstrony na drugą jest wiele, możemy to zrobić z poziomu protokołu HTTP - parametrem Location. Lecz dla niektórych przeglądarek, antywirusów czy routerów ten parametr jest nie mile widziany. Dlatego też, może stać się tak, że w procesie pobierania dokumentu może on gdzieś... zniknąć.

  • I przekierowania nie ma...

Kolejnym sposobem, jest tag <meta /> umieszczany w sekcji <head /> dokumentu. Skuteczność takiego rozwiązania, jest prawie stuprocentowa. Najwyżej któryś z klientów - na własne życzenie, zostanie zapytany czy na pewno, ma dojść do przekierowania.

  • "Własne życzenie", ustawia się w polityce bezpieczeństwa browsera...

Ostatnim sposobem - o którym tutaj wspomnę, jest JavaScript - za pomocą obiektu location, oraz pola href natychmiast możemy zmienić interesujący nas dokument. Ale aby zbyt pięknie nie było, w tym przypadku dotyka nas jak-świat-stary-problem. Co wtedy gdy, klient wyłączy JavaScript? Dokładnie, nic.

How to stop javascript refresh?

Dlatego dla największej dostępności, w profesjonalnych projektach sposób numer dwa wydaje się być najlepszym rozwiązaniem. Tylko tutaj nasuwa się pytanie; jak zatrzymać przekierowanie w momencie gdy się "rozmyślimy"?

  • Dla przykładu; klient w dokumencie klika na dynamiczny - zasilany JavaScriptem, panel i zaczyna wypełniać formularz. Wypada zresetować mu zawartość formularza oraz postawić go przed innym dokumentem?

Tak jak dla pierwszego sposobu nie ma żadnej opcji "odwrotu", tak dla trzeciego jest - i to całkiem prosty.

  1. <head>
  2.   <script type="text/javascript"><!--
  3.   var _timer = null;
  4.  
  5.   window.onload = function() {
  6.     _timer = window.setTimeout(function() {
  7.       location.href = "http://www.example.net/";
  8.     },5*1000);
  9.   }
  10.  
  11.   // Zatrzymuje przekierowanie, o ile
  12.   // nie zostało jeszcze wywołane.
  13.   function stopTimer() {
  14.     window.clearTimeout(_timer);
  15.   }
  16.   --><script>
  17. </head>

How to stop meta refresh?

A jak zatrzymać przekierowanie <meta />? Tutaj sprawa się komplikuje. Mozilla Firefox oraz Safari zadowalają się wywołaniem window.stop() zaraz po wczytaniu dokumentu. Bez względu na to czy odliczanie się już skończyło, czy też nie.

  • Dlaczego po wczytaniu? W przypadku przekierowania tagiem <meta />, każda przeglądarka inicjuje odliczanie dopiero po wczytaniu całego dokumentu.
  1. <meta http-equiv="refresh" id="_refresh" content="0;url=http://www.example.net/" />
  1. window.addEventListener("load",function() {
  2.   window.stop();
  3. },false);

Natomiast Opera oraz Internet Explorer, wywołanie window.stop() oczekują dokładnie w momencie wywołania procedury wczytania nowej strony (czyli w momencie przekierowania).

  • No może nie Internet Explorer, bo... nie obsługuje window.stop(). Naszczęście jest document.execCommand("Stop");.

Na wszelki wypadek - bo nie wiemy nigdy jak długo przeglądarka będzie inicjować wczytanie nowej strony, funkcje stopującą można wywołać kilka razy w odstępie kilku milisekund.

  1. var _time = document.getElementById("_refresh");
  2. _time = _time.getAttribute("content").toInt();
  3.  
  4. window.onload = function() {
  5.   window.setTimeout(function() {
  6.     var count = 0;
  7.     var interval = window.setInterval(function() {
  8.       if(count++ > 100)
  9.         window.clearInterval(interval);
  10.       if(_browser.ie)
  11.         window.document.execCommand("Stop");
  12.       else
  13.         window.stop();
  14.     },5);
  15.   },_time*1000);
  16. };

Samodzielny kod w akcji, można zobaczyć tutaj.

Komentarze do wpisu "Jak zatrzymać przekierowanie meta...":

1. b4rtaz napisał(a):
23 sierpnia 2008, 16:58:52

Nagłówki w wpisie w języku angielskim na rzecz… angielskich developerów.

2. Michał Górny napisał(a):
23 sierpnia 2008, 19:09:19

> Lecz dla niektórych przeglądarek, antywirusów czy routerów ten parametr jest nie mile widziany. Dlatego też, może stać się tak, że w procesie pobierania dokumentu może on gdzieś... zniknąć.

Że co? Skąd takie informacje? Jakim prawem/cudem? No, chyba że ktoś podaje „Location” z niewłaściwym kodem statusu, to wtedy nie wykluczę, że może olać.

3. PiotrLegnica napisał(a):
23 sierpnia 2008, 19:23:22

Po co ustawiać przekierowanie skoro ma być anulowane? o.O Nie mówiąc już o tym, że całe to kombinowanie robi FAIL, gdy JS jest zablokowany (a wywoływanie czegokolwiek co kilka ms to chybiony pomysł).

I nie- z przymiotnikami łącznie. Lern ur polspek.
I czemu te komentarze są tak beznadziejnie położone?

4. Wasacz napisał(a):
24 sierpnia 2008, 11:04:20

Ale się naszukałem formularza…

Chyba każdy normalny UA potrafi zatrzymać przekierowanie wykonane za pomocą wszystkich wymienionych we wpisie sposobów…

Że nie wspomnę o tym, że przekierowanie w JS to idiotyzm, a co do „Location”, to tak jak Michał napisał – bzdura.

5. pijanyadmin napisał(a):
25 sierpnia 2008, 23:46:21

Ciekawy szablon masz, trochę mało czytleny, ale i tak miło popatrzeć na coś orginalnego.

Macie na mysli :

header(‘Location: http://localhost/przekierowanie ‘);

fakt na tym IE6 się wykłada :P

Dodaj komentarz: