Discussione:
[DW] - controlli JS per posizionare una pagina dopo il refresh
(troppo vecchio per rispondere)
asleo - 3DirTeam
2004-09-08 14:16:13 UTC
Permalink
hola nius.
Come il mio amico puppet, sto studiando "web"...
ho questo problema su una pagina html+php:
La pagina e' molto lunga in verticale. Si tratta di un form per l'inserimento
dati in un DB, dati che poi saranno processati dal mio cicione (ehehhe).
L'utente puo' aggiungere campi di inserimento e per farlo invia una richiesta
POST alla pagina stessa (in realta' questa pagina e' in un frameset, quindi il
POST viene inviato al file che lo definisce). la pagina che riceve il POST lo
processa, aggiunge il campo nel DB, ridisegna la pagina del form e la invia al
browser "aggiornata". E qui viene il punto: la pagina, essendo richiamata da
"fuori" si posiziona al suo inizio. L'utente deve quindi scorrerla fino a
giungere al punto in cui era prima dell'aggiornamento.
La mia domanda: come posso "segnare" la posizione y della pagina nel browser al
momento dell'invio del POST per poi rimandarla alla pagina stessa e farla
posizionare li' dove era? E come faccio a fare anche questa cosa? (Qui so che
posso usare l'evento onload del body, ma cosa gli dico?)

Ho cercato in rete, ma non ho trovato nulla. Per capirci, kataweb nella sezione
news ha un refresh automatico. Dopo ilk refresh la pagina viene ricaricata
(serve appunto per far leggere le ultime news all'utente) e si riposiziona
esattamente dove era prima dell'agiornamento. proprio come devo fare io, solo
che non lo so fare. per vedere la cosa: www.kataweb.it/news.

Danke :)
--
asleo
Italian Director Developer --> www.3DirTeam.net
Ingenium Manager --> www.ingenium.ws
esse74
2004-09-08 15:40:39 UTC
Permalink
Ciao,
per il reload della pagina potresti usare, per esempio, sull'evento
onclick di un link l'istruzione javascript
window.parent.opener.location.reload().
Per il riposizionamento, non lo so se ho capito bene :), non potresti usare
l'evento focus ridando il fuoco a quel campo di testo di quel determinato
frames?

Ciao
Max
2004-09-08 23:59:49 UTC
Permalink
Post by asleo - 3DirTeam
La mia domanda: come posso "segnare" la posizione y della pagina nel browser al
momento dell'invio del POST per poi rimandarla alla pagina stessa e farla
posizionare li' dove era? E come faccio a fare anche questa cosa? (Qui so che
posso usare l'evento onload del body, ma cosa gli dico?)
Niente di tutto ciò. Se ho capito bene cosa devi fare basta usare un anchor
point al reload della pagina.

www.asleo.net/pagina.php#citta?DB=asleo&element=citta

Ovviamente quando generi il form con il nuovo elemento sopra ci devi
scrivere il tag per l'ancoraggio.
E' un esempio. Spero di aver centrato il problema.

Max
3DirTeam - asleo
2004-09-10 23:48:51 UTC
Permalink
Post by asleo - 3DirTeam
La mia domanda: come posso "segnare" la posizione y della pagina nel
browser al momento dell'invio del POST per poi rimandarla alla pagina
stessa e farla posizionare li' dove era? E come faccio a fare anche
questa cosa? (Qui so che posso usare l'evento onload del body, ma cosa
gli dico?)
Well.
Innanzitutto grazie ad esse74 e Max (vi ho ringraziato subito, ma il
server MM deve aver avuto qualche problema nei guorni scorsi...)
Posto per far conoscere a chi e' interessato la soluzione che ho
trovato. Si tatta di javascript (ovviamente) e di cookie. All'evento
unload viene settato un cookie che contiene la posizione Y della pagina.
All'evento load viene letto il cookie, settato il valore e spostata la
pagina a quella posizione. Il tutto si basa su due comandi javascript:
pageYOffset per la lettura della posizione attuale e scrollTo per il
posizionamento della pagina stessa. Il codice completo e' questo:

**********************
**********************

<html>
<head>
<title>Riposizionamento automatico verticale</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script language="JavaScript">

var posV

function scriviCookie (value) {
var todayDate = largeExpDate = new Date ();
largeExpDate.setTime(todayDate.getTime() + 40000);
document.cookie = 'posV='+escape(value)+'; expires=' +
largeExpDate.toGMTString();
}

function leggiCookie() {
var search = "posV="
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
end = document.cookie.indexOf(";", offset);
if (end == -1){
end = document.cookie.length;
return unescape(document.cookie.substring(offset, end))
}
}
}
}

function settaPosV () {scriviCookie(self.pageYOffset);}

function posizionaPagina() {
posV=leggiCookie();
self.window.scrollTo(0,posV);
}


</script>

</head>

<body onLoad="posizionaPagina()" onUnload="settaPosV ()">


**********************
**********************


Detto questo, aggiungo che mentre il codice di cui sopra funziona
benissimo con pagine create apposta per testarlo, nella pagina che a me
serve non funziona. Ho provato a testare cosa accade, usando un alert.
Ebbene, non setta la variabile posV, come se non leggesse il cookie.
Eppure il browser lo legge. Anzi, diro' di piu'. Ho provato a scrivere
il cookie con la pagina che a me serve ed a leggerlo con un'altra
pagina, creata apposta e vuota a meno dello script. Ebbene: lo legge
senza problemi. Perche' accade questo?
Nella pagina che non fuziona c'e' una prima parte in php, ma e' solo
l'apertura di una sessione ed il settaggio di alcune variabili.
L'estensione e' .php, ma non e' questo il problema (ho provato con altre
pagine .php e funziona). L'unica cosa che penso possa essere causa del
problema e' che la pagina in questione e' molto lunga: contiene un bel
po' di testo ed immagini. Ho letto in giro in rete che c'e' un problema
di redraw della pagina quando questa e' particolarmente lunga, ma non
ricordo dove ne' di preciso cosa si diceva...

Any suggestions?

Grazie
--
asleo
Italian Director Developer --> www.3DirTeam.net
Ingenium Manager --> www.ingenium.ws
Max
2004-09-11 07:43:11 UTC
Permalink
Ciao!
Allora... ti sconsiglio di usare cookie. Chi ti dice che l'utente ha i
cookie abilitati? Magari utilizza un antivirus, un altro sistema di
sicurezza. Oggi, fortunatamente, si ha una politica *restrittiva* nei
confronti di questi sistemi.
E' il motivo per cui non si dovrebbero utilizzare altri activex, vbscript
ecc.
Oltretutto è sprecato il cookie perché ci sono altri metodi per passare i
dati.
Hai provato il mio (con anchor point)?
Un altro semplicissimo, visto che ti trovi in ambito JS, è quello di passare
le coordinate della pagina direttamente nella query. Alla rigenerazione
della stessa pagina puoi:
1. Scrivere le coordinate nello stesso script JS residente nella stessa
pagina
2. Analizzare la stessa query con JS per le coordinate
Nota che entrambi questi 2 metodi devono essere eseguiti con l'evento load.
Riguardo al fatto che il cookie non viene letto questo è dovuto al fatto che
non è immediatamente disponibile e quindi essere letto dalla stessa pagina.
Non c'entra niente l'estensione, il layout e la lunghezza della pagina ;)

Bye
Max
asleo - 3DirTeam
2004-09-11 10:40:33 UTC
Permalink
Post by Max
Ciao!
Allora... ti sconsiglio di usare cookie.
Ciao. Generalmente non li uso, ma a questo form avranno accesso 10 persone
(dieci sul serio, non tanto per dire un numero) contate, conosciute ed
autenticate :)
Post by Max
Hai provato il mio (con anchor point)?
Il tuo ha il "difetto" di mandare l'utente ad un punto che e' "quasi" lo stesso
che ha lasciato, a meno di mettere anchor a tutte le righe :)
Volevo evitare anche questa "piccolezza"
Post by Max
Un altro semplicissimo, visto che ti trovi in ambito JS, è quello di passare
le coordinate della pagina direttamente nella query.
Questo non sono convinto di poterlo fare, visto che faccio la chiamata col POST.
Come potrei passare il valore di pageYOffset?
Post by Max
Riguardo al fatto che il cookie non viene letto questo è dovuto al fatto che
non è immediatamente disponibile e quindi essere letto dalla stessa pagina.
Non c'entra niente l'estensione, il layout e la lunghezza della pagina ;)
Concordo (almeno in linea teorica9 che l'estensione e la lunghezza non c'entrino
nulla, ma:
1. ho letto 'sto fatto della lunghezza su un post. Non l'ho sognato :)

2. il coockie viene letto tranquillamente da pagine piu' corte. prova a fare un
copia ed incolla del codice che ho postato, mettilo in una pagina qualciasi,
carica la pagina nel browser, scrollala e poi fai un "aggiorna" oppure, meglio,
mettici tanti bei link a se stessa (ma non con il #, con l'url intero). Vedrai
che funziona benissimo: il cookie viene letto e processato.
Il cookie viene scritto all'unload, quindi e' ovvio che alprimo caricamento non
e' disponibile. Ma questo non e' un problema perche' in questo caso js valuta
zero il suo valore e mette la pagina al suo top, come deve fare. Dal primo
refresh in poi il cookie esiste e viene caricato.
Ripeto: la cosa funziona benissimo con altre pagine. Con questa no :(

btw, grazie del supporto :)
Chissa', alla fine usero' l'anchor...

ciao
--
asleo
Italian Director Developer --> www.3DirTeam.net
Ingenium Manager --> www.ingenium.ws
Max
2004-09-11 12:56:33 UTC
Permalink
Post by asleo - 3DirTeam
Il tuo ha il "difetto" di mandare l'utente ad un punto che e' "quasi" lo stesso
che ha lasciato, a meno di mettere anchor a tutte le righe :)
Volevo evitare anche questa "piccolezza"
In teoria l'anchor point essendo un "rigo" più su o più giù del punto
preciso è un vantaggio.
Ovviamente dipende dal layout. Da quello che mi sembra capire a te serve
qualcosa di molto preciso.
Post by asleo - 3DirTeam
Questo non sono convinto di poterlo fare, visto che faccio la chiamata col POST.
Come potrei passare il valore di pageYOffset?
All'onSubmit del form crei una funzione che, oltre a verificare la validità
dei dati, aggiunge anche i valori delle coordinate.
Oppure crei nel form due campi hidden a cui, sempre con la funzione di cui
sopra, assegni i valori delle coodinate.
Tutto prima di mandare in POST.
Alla rigenerazione della pagina scrivi un JS che all'onload (sul body) ti
rimanda a quelle coordinate.
Post by asleo - 3DirTeam
Ripeto: la cosa funziona benissimo con altre pagine. Con questa no :(
Ripeto: niente cookie :) Regole fondamentali: niente cookie, niente
vbscript, niente eventi in linea, niente frameset ecc. ecc.

Saluti
Max

Loading...