Newsgroup: it.comp.www.asp
Titolo: IE5 bug: che ne dite di questa soluzione?

Visto che finalmente sono riuscito a far parlare tra di loro i cookie asp e
quelli Javascript ho riscritto la funzioncina che potrebbe essere inclusa in
tutte le pagine per risolvere (senza reload superflui, almeno fino a che
qualcuno di voi non mi smentisca) il problemino nato con IE5.
Per ogni altro approfondimento riferitevi all'articolo su 
www-asp-it.com
 ma
la versione da me riscritta dovrebbe risolvere anche quel reload superfluo
che rimaneva in agguato.
Ripeto il funzionamento e':
setto il cookie via asp al valore ASPED, lo leggo via JS: se trovo asped
vuol dire che la prima parte e' stata eseguita e mi limito a settarlo a
JSCRIPTED, se trovo jscripted (allora il cookie non e' stato risettato via
asp) forzo un reload. Tutto si basa sul fatto che comunque il javascript e'
rieseguito ad ogni giro.
Oltre al problemino con il path JS aveva qualche problemino a lavorare con
un nome di cookie in cui erano presenti slash e punti, da qui l'elaborazione
della stringa.
Aspetto commenti.
Ciao, Fabio Zed Zamparelli
Propongo due file per utilizzare e ricreare la situazione ed il vero codice
da includere:
***************inizio codice TESTcookie2.asp***********************
<%
response.expires=0
ricarica=true
biscotto=Replace(Replace(Request.ServerVariables("SCRIPT_NAME"), "/", "SL"),
".", "DT")
%>
<!--#include file="ie5bug.inc"-->
<html>
<head>
<title>Prova IE5 bug</title>
</head>
<body>
<%
'una bella variabile application per capire meglio quando una pagina viene
ricalcolata
Application.lock
Application.Value("TestVar")=Application.Value("TestVar")+1
Application.UnLock
Response.write(Application.Value("TestVar")&"<br>")
Response.write(now()&"<br>")
%>
<p align="center">Nome Cookie <strong>=
<%=Request.ServerVariables("SCRIPT_NAME")%></strong> o ora<strong>
<%=biscotto%></strong></p>
<p align="center">&nbsp;</p>
<p align="center">ValoreASP1 letto via ASP all'inizio della pagina<strong>=
<%=valoreASP1%> (<%=biscotto%>)</strong></p>
<p align="center">ValoreASP2 letto via ASP dopo averlo settato via
ASP<strong>= <%=valoreASP2%> (<%=biscotto%>)<br>
(può non essere aggiornato e quindi indicare una falsa lettura nel caso che
l'asp non
venga rieseguito)</strong></p>
<p align="center">ValoreJS letto prima di far partire bugIE5<strong>=
<%response.write(_
   "<script LANGUAGE=""JavaScript""><!--"+ Chr(13) + Chr(10) +_
 "document.write (GetCookie('"&biscotto&"') + "" ("&biscotto&")<br>"");"+
Chr(13) + Chr(10) +_
 "file://document.write (document.cookie + ""<br>"");"+ Chr(13) + Chr(10) +_
 "// --></script>")
%></strong><br>
<strong>(è questo il valore da guardare attentamente, se non vale ASPED
allora il codice
asp non è stato rieseguito e bisogna eseguire il reload)</strong></p>
<p align="center">Sto Per Far Partire bugIE5 <%response.write(_
   "<script LANGUAGE=""JavaScript""><!--"+ Chr(13) + Chr(10) +_
 "bugIE5('"&biscotto&"');"+ Chr(13) + Chr(10) +_
 "// --></script>")%> </p>
<p align="center">ValoreJS letto dopo aver fatto partire bugIE5<strong>=
<%response.write(_
   "<script LANGUAGE=""JavaScript""><!--"+ Chr(13) + Chr(10) +_
 "document.write (GetCookie('"&biscotto&"') + "" ("&biscotto&")<br>"");"+
Chr(13) + Chr(10) +_
 "file://document.write (document.cookie + ""<br>"");"+ Chr(13) + Chr(10) +_
 "// --></script>")
%></strong></p>
<p align="center"><a href="TESTcookie2bis.asp">Vai in un'altra
pagina</a></p>
</body>
</html>
***************fine codice TESTcookie2.asp***********************
***************inizio codice TESTcookie2bis.asp***********************
<html>
<head>
<title>Home page</title>
</head>
<body>
<p align="center">Torna alla pagina TESTcookie2.asp <a
href="TESTcookie2.asp">con un link</a></p>
<p align="center">Oppure premi back</p>
<p align="center"><%=now()%></p>
</body>
</html>
***************fine codice TESTcookie2bis.asp***********************
***************inizio codice ie5bug.inc***********************
<%
'Set Browser=Server.CreateObject("MSWC.BrowserType")
'brows=(Browser.browser&Browser.version)
'Set browser=Nothing
brows="ie5.0"
'per utilizzare la funzione realmente solo con ie5 aggiornare in
browscap.ini e rimuovere opportunamente le note (oltre che inserire un if
analogo nella chiamata alla funzione ie5bug)
if LCase(brows)="ie5.0" and ricarica then
 'da eliminare inseriti per debug*************
 valoreASP1=request.cookies(biscotto)
 'da eliminare inseriti per debug*************
 Response.Cookies(biscotto) = "ASPED"
 Response.Cookies(biscotto).Path = "/"
 ' ovvero il cookie nominato come la pagina viene riempito con il valore
ASPED
 ' dopodicche' si inseriscono le funzioni JavaScript
 'da eliminare inseriti per debug*************
 valoreASP2=request.cookies(biscotto)
 'da eliminare inseriti per debug*************
%>
<SCRIPT LANGUAGE="JavaScript">
<!--
// bug fix per il caching con IE5
// Copyright 1999 Daniele Bochicchio & Fabio Zed Zamparelli
// versione 2.0 - 
http://www.asp-it.com/articoli/IE5bug.asp
// In collaborazione con
// ASP-it.com soluzioni per ASP 
http://www.asp-it.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(nomecookie)
var valoreJS= GetCookie(nomecookie);
if (valoreJS == 'ASPED')
SetCookie (nomecookie, "JSCRIPTED", null, '/');
// ovvero se trovo ASPED vuol dire che a questo giro la pagina e' stata
rieseguita dal server
}
else {
// se trovo JSCRIPTED vuol dire che il codice asp chiamato a riempire il
cookie
// all'inizio della pagina non e' stato rieseguito dunque procedo ad un
reload
location.reload();
}
}
//-->
</SCRIPT><%
end if
%>
***************fine codice ie5bug.inc***********************

















***************fine codice TESTcookie2.asp***********************
***************inizio codice TESTcookie2bis.asp***********************
<html>

<body>





<SCRIPT LANGUAGE="JavaScript">
<!--




function bugIE5(nomecookie)
var valoreJS= GetCookie(nomecookie);


}
file://-->
