Aggirare il bug di Internet Explorer 5 riguardante l'expire delle pagine ASP

di Daniele Bochicchio, in ASP - Scripting,

Internet Explorer 5 è un gran bel passo in avanti, non c'è che dire, per quanto riguarda i browser. Ma purtroppo come è ormai consuetudine da un po', tutti i software, chi più chi meno, hanno dei piccoli bugs, alcuni innocui, alcuni molto pericolosi.

Ebbene, abbiamo scoperto che la nuova versione di IE5 (in italiano, per quella inglese non saprei...) ha un piccolo bug che deriva dalla nuova cache intelligente (?) di cui è dotato. In pratica se si imposta l'expire di una pagina ASP su zero (utile per pagine che inseriscono dati in un database, o che si aggiornano di frequente pescando dati dinamici), e poi si passa su un'altra pagina, navigando tramite i pulsanti Back e Forward di IE5, questo si rifiuta di ricaricare le pagine. E non è una cosa buona, visto che ci sono molti casi in cui è necessario ricaricare la pagina ogni volta che ci si passa.
Per inciso, il problema sembra non verificarsi se si ridigita l'indirizzo, o se si usano dei links. E non siamo riusciti a risolvere il problema neanche intervenendo sul client, cosa per molti versi scomoda. Chi ha il coraggio di obbligare mille utenti ad installarsi un Service Pack, o a cambiare le impostazioni del proprio browser, alzi la mano...

Per questo ho cercato di trovare una soluzione al problema che fosse tanto più indipendente dal client quanto possibile. Unica soluzione al problema, usare codice JavaScript mischiato a codice ASP. Il risultato è stato qualcosa di sublime: si capisce fino a dove può arrivare la potenza di un'applicazione se si è in grado di maneggiare diversi linguaggi/tecnologie.

Il codice qui sotto riportato chiarisce tutti i dubbi. E' disponibile al taglia ed incolla, a patto che rimanga il copyright ben visibile.
Devo dire che una grossa mano me l'ha data Fabio Zed Zamparelli, che mi ha dato l'idea del cookies da impostare con JavaScript. Il funzionamento è semplice. Per prima cosa viene instanziata una copia dell'oggetto MSWC.BrowserType che rileva il browser in uso e imposta una variabile lato server di nome brows con nome e versione. Per riconoscere le ultime versioni dei browser, incluso quindi IE5, è necessario scaricare l'aggiornamento del file browscap.ini, che contiene le informazioni sui browser.

Nel caso in cui il browser sia IE5, viene eseguito un codice ASP che si occupa di scrivere il codice JavaScript lato client da eseguire.
Il codice in questione si occupa di fare un confronto tra il cookie memorizzato in precedenza, ed un valore preciso. Visto che la funzione che contiene il controllo viene eseguita ogni volta che la pagina viene ricaricata, anche dalla cache, viene letto ogni volta il valore contenuto. Nel caso sia impostato su un determinato valore (si è tornati indietro col pulsante back o forward) viene scatenato un evento che riporta il cookie al valore iniziale, pronto quindi per far ricaricare la pagina.
Si tratta quindi di un semplice confronto fra cookie, molto semplice da implementare, ed efficace.

<% 
page=Request.ServerVariables("SCRIPT_NAME")

biscotto=Replace(Replace(page, "/", "SL"), ".", "DT")

ricarica=true ' da impostare nella pagina che richiama questo include

Set Browser=Server.CreateObject("MSWC.BrowserType")
brows=(Browser.browser&Browser.version)
Set browser=Nothing

if LCase(brows)="ie5.0" and ricarica then
%>

<SCRIPT type="text/javascript">

<!--

// bug fix per il caching con IE5

// Copyright 1999 Daniele Bochicchio & Fabio Zed Zamparelli

// versione 2.0 - http://www.ASPItalia.com/articoli/IE5bug.aspx

// In collaborazione con

// ASPItalia.com soluzioni per ASP http://www.ASPItalia.com


function getCookieVal (offset) {

  var endstr = document.cookie.indexOf (";", offset);

  if (endstr == -1)

  endstr = document.cookie.length;

  return unescape(document.cookie.substring(offset, endstr));

}


function GetCookie (name) {

  var arg = name + "=";

  var alen = arg.length;

  var clen = document.cookie.length;

  var i = 0;

  while (i < clen) {

  var j = i + alen;

  if (document.cookie.substring(i, j) == arg)

  return getCookieVal (j);

  i = document.cookie.indexOf(" ", i) + 1;

  if (i == 0) break;

  }

  return null;

}


function SetCookie (name,value,expires,path,domain,secure) {

  document.cookie = name + "=" + escape (value) +

  ((expires) ? "; expires=" + expires.toGMTString() : "") +

  ((path) ? "; path=" + path : "") +

  ((domain) ? "; domain=" + domain : "") +

  ((secure) ? "; secure" : "");

}


function bugIE5() {


  var valoreJS= GetCookie('<%=biscotto%>');


  if (valoreJS == 'ASPED') {


  SetCookie ('<%=biscotto%>', "JSCRIPTED", null, '/');

  }

  else {

  location.reload();

 }


}

//-->

</SCRIPT><%

end if

%>
<body<%

if LCase(brows)="ie5.0" and ricarica then
  Response.Write(" onLoad=""bugIE5();"" ")
end if

%>>

Questa nuova versione elimina alcuni problemi di doppio caricamento verificatisi con la prima versione, ed è un buon rimedio, anche considerato, che, come detto prima, anche se uscirà una patch per IE5, non si potrà obbligare gli utenti ad installarla. Per cui, meglio arrangiarsi alla men peggio, almeno per tentare di preservare il proprio lavoro e farlo funzionare così come lo si è progettato.

Contenuti dell'articolo

    Commenti

    Visualizza/aggiungi commenti

    | Condividi su: Twitter, Facebook, LinkedIn

    Per inserire un commento, devi avere un account.

    Fai il login e torna a questa pagina, oppure registrati alla nostra community.

    Approfondimenti

    Nessuna risorsa collegata