Sì, si può fare in vari modi ma tutti hanno qualche problema. Te ne illustro qualcuno così potrai scegliere.
Il fatto è che la soluzione che ti ho postato ha un grosso limite che è quello di delegare al server una decisione che spetta al client.
Se si tratta di un semplice refresh la cosa non appare evidente perché l'utente chiede al server di reinviare la pagina, il server si fa i suoi conti e decide se inviarla con la div o senza. E tutto va bene.
Se invece si tratta di cliccare su un pulsante la cosa è diversa perché l'utente in quel caso non chiede esplicitamente un reinvio della pagina e quindi non si aspetta che questo avvenga ma, d'altra parte, occorre comunicare al server che il pulsante è stato cliccato e questo si può fare solo tramite un form che ricarichi la pagina.
In altre parole nel momento in cui l'utente clicca per chiudere la div non gli si chiuderà la div ma gli si ricaricherà la pagina senza div. E le due cose sono molto diverse anche se il risultato è lo stesso.
Insomma, secondo me è una brutta soluzione. Se avessi letto con più attenzione il tuo post iniziale avrei potuto accorgermene subito visto che già lì parlavi del pulsante di chiusura. I'm sorry.
Tutto considerato quindi la soluzione formalmente corretta resta quella che avevi scelto inizialmente cioè di fare tutto in locale tramite "display:none" e cookie.
Se però quella soluzione risulta impraticabile ... questo è il codice, valuta tu se può andarti bene:
codice:
<?php session_start(); ?>
<html>
<head>
</head>
<body>
<div>
questa c'è sempre
</div>
<?php
if ($_GET['f'] == "x") {
$_SESSION['flag'] = true;
}
if (!$_SESSION['flag']) {
?>
<div style="border:1px solid red; width:300px;">
leggi questo testo e poi clicca su chiudi
<form method="get" action="prova.php">
<input type="hidden" name="f" value="x">
<input type="submit" value="chiudi">
</form>
</div>
<?php
}
?>
<div>
anche questa c'è sempre
</div>
</body>
</html>
come vedi ho inserito un form che invia, via get, una variabile di nome f e valore x.
Ho usato il get invece del post per evitare che al refresh compaia la finestrella di richiesta di reinvio dei dati che disturberebbe ulteriormente il navigatore.
In questo modo la variabile di session che impedisce successivi reinvii non viene impostata a true dopo il primo invio ma solo se dal get è stata ricevuta la variabile f con valore x cioè solo se il pulsante è stato cliccato.
Come ti dicevo questa è una soluzione che non mi piace a causa del doppio invio della pagina ma questo forse si può risolvere intercettando, via js, la richiesta di refresh e inserendo, sempre via js, la variabile di get nell'url. In questo caso quindi il div si potrebbe chiudere con display:none e si eviterebbe la doppia chiamata al server (a meno che non venga esplicitamente richiesta con un refresh). Così su due piedi non saprei dirti come intercettare il refresh ma sicuramente si può fare, per puntare all'url invece credo che si usi this.location.
Un'altra soluzione può essere quella di aprire un pop-up la prima volta gestendo l'evento onLoad Però se i pop-up sono bloccati questo non funziona.
Comunque questo è il codice:
codice:
<?php session_start(); ?>
<html>
<head>
</head>
<?php
if (!$_SESSION['flag']) {
$_SESSION['flag'] = true;
?>
<body onLoad="javascript:window.open('avviso.htm','Testo_Preliminare','width=600,height=450,left=50,top=50,scrollbars=yes').creator;">
<?php
} else {
?>
<body>
<?php
}
?>
<div>
questa c'è sempre
</div>
<div>
anche questa c'è sempre
</div>
</body>
</html>
chiaramente devi fare un'altra pagina, avviso.htm, con la div da visualizzare una sola volta.
Vedi tu, spero di averti dato qualche spunto.
Ciao