2009-08-01 10 views
5

Ho effettuato alcune ricerche per questo problema e sono venuto a mani vuote. Spero che qualcuno possa chiarire le cose per me e indicarmi la giusta direzione.Il browser non ricorda la posizione dell'ultima pagina visualizzata

Problema: Ho una pagina che visualizza un elenco di risultati dopo aver inviato un modulo di ricerca. Quando un utente fa clic su uno dei risultati, il browser passa a una nuova pagina che mostra ulteriori informazioni sul risultato. Quando l'utente fa clic sul pulsante "Indietro" per caricare i risultati, il mio browser ricarica la pagina e mostra la parte superiore della pagina anziché il risultato che è stato fatto l'ultimo clic.

Obiettivo: Quello che vorrei è questo: quando l'utente clicca il pulsante Indietro, il browser deve tornare alla pagina precedente e, invece di mostrare la parte superiore della pagina, visualizzare la pagina nella posizione precedente .

Soluzione: Sono completamente perso come questo risultato può essere raggiunto. Potrebbe avere qualcosa a che fare con javascript, o le intestazioni inviate ai browser, forse qualcosa a che fare con il caching.

risposta

0

Ho risolto questo problema inviando intestazioni con php. Questa era la mia soluzione:

header("Expires: 0"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: store, cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", FALSE); 

Grazie a tutti per l'aiuto.

+1

Sai perché funziona? Se un browser deve tornare indietro e colpire il server Web per il contenuto, perché è più probabile che mantenga le informazioni sullo stato della pagina sul pulsante Indietro? – Anirvan

2

Se questa è la incredibilmente importante, suggerirei indagando la seguente:

  • aggiungere id s per ogni link in uscita
  • uso JavaScript per catturare l'onClick per i collegamenti
  • quando un si fa clic sul collegamento, si reindirizza l'utente a quello fragment identifierfragment identifier, quindi si collega come desiderato

Quando l'utente preme il pulsante Indietro, tornerà a quel link specifico, ad es. http://www.example.com/#link27 invece di http://www.example.com/

Si può essere in grado di ottenere alcune idee da qui:

+0

Quindi lo pseudo codice sarebbe simile al seguente: 1. L'utente fa clic su un collegamento nell'elenco dei risultati. 2. Un evento onClick viene chiamato dal collegamento su cui è stato fatto clic. 3. La funzione chiamata dall'evento ottiene l'id del collegamento. 4. La funzione reindirizza la pagina alla pagina dei risultati con l'ID del collegamento aggiunto alla fine dell'indirizzo. 5. Dopo che la pagina dei risultati viene ricaricata, la funzione reindirizza la pagina alla pagina con ulteriori informazioni sui risultati. E 'questo che intendi? Posso vedere come funziona, ma sarebbe bello trovare un modo più diretto senza dover ricaricare la pagina dei risultati una seconda volta – VinkoCM

+0

Sì, esattamente. E sì, è complicato. – Anirvan

+0

@VinkoCM, non dovrebbe essere necessario ricaricare una pagina intera. Spostarsi tra i frammenti della stessa pagina dovrebbe essere quasi istantaneo sulla maggior parte dei browser. – Anirvan

0

La prima parte della risposta è che si utilizza ancore per atterrare su una pagina diversa da quella superiore. Quindi, se ho questo nel mio HTML nella parte inferiore della mia pagina:

<a name="f"></a> 

allora posso avere la terra degli utenti Non ci aggiungendo l'ancora alla fine del egli url:

http://www.bullionvalues.com/glossary.aspx#f 

Così, se si sta parlando di ASP.Net è possibile posizionare l'ancora in un campo nascosto nella pagina di informazioni della pagina e quindi leggerlo dalla pagina di ricerca utilizzando la proprietà Page.PreviousPage.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.PreviousPage != null) 
    { 
     Object o = PreviousPage.FindControl("hfAnchor"); 
     if (o != null) 
     { 
      HiddenField hf = o as HiddenField; 
      Response.Redirect(Request.Url+"#"+hf.Value); 
     } 
    } 
} 
+0

Sfortunatamente, sto usando PHP e non so nulla di ASP.NET – VinkoCM

1

È possibile utilizzare JavaScript e jQuery per impostare la posizione di scorrimento della finestra e cookie per memorizzare la posizione per scorrere fino a.Nel javascript della pagina con i risultati della ricerca si potrebbe avere qualcosa di simile:

var COOKIE_NAME = "scrollPosition"; 
$(document).ready(function() { 

    // Check to see if the user already has the cookie set to scroll 
    var scrollPosition = getCookie(COOKIE_NAME); 
    if (scrollPosition.length > 0) { 
     // Scroll to the position of the last link clicked 
     window.scrollTo(0, parseInt(scrollPosition, 10)); 
    } 

    // Attach an overriding click event for each link that has a class named "resultLink" so the 
    // saveScrollPosition function can be called before the user is redirected. 
    $("a.resultLink").each(function() { 
     $(this).click(function() { 
      saveScrollPosition($(this)); 
     }); 
    }); 

}); 

// Get the offset (height from top of page) of the link element 
// and save it in a cookie. 
function saveScrollPosition(link) { 
    var linkTop = link.offset().top; 
    setCookie(COOKIE_NAME, linkTop, 1); 
} 

// Boring cookie helper function 
function getCookie(name) { 
    if (document.cookie.length > 0) { 
     c_start = document.cookie.indexOf(name + "="); 
     if (c_start != -1) { 
      c_start = c_start + name.length + 1; 
      c_end = document.cookie.indexOf(";", c_start); 
      if (c_end ==- 1) c_end = document.cookie.length; 
      return unescape(document.cookie.substring(c_start, c_end)); 
     } 
    } 
    return ""; 
} 
// Another boring cookie helper function 
function setCookie(name, value, expiredays) { 
    var exdate = new Date(); 
    exdate.setDate(exdate.getDate() + expiredays); 
    document.cookie = name + "=" + escape(value) + 
     ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString()); 
} 

Ciò presuppone la tua ricerca link risultato hanno class="resultLink".