Newsgroup: it.comp.lang.javascript
Titolo: Funzione per navigare in pagine numerate

Salve a tutti,
Sto costruendo un sito statico con tantissime pagine divise perň in poche 
tipologie.
Le tipologie sono libri, penne, gomme, e qualche altra.
Le pagine sono:
libri_01.htm
libri_02.htm
libri_03.htm
libri_04.htm
...
penne_01.htm
penne_02.htm
penne_03.htm
penne_04.htm
...
gomme_01.htm
gomme_02.htm
gomme_03.htm
gomme_04.htm
...
In tutte le pagine ho due tasti di navigazione che vorrei andassero alla 
pagina precedente e successiva (all'interno della stessa tipologia).
Per esempio, sul tasto AVANTI avrei bisogno di una funzione che leggesse la 
stringa dell'url corrente, trovasse la cifra (due caratteri) compresa tra 
"libri_" e ".htm", la incrementasse di 1 e mi fornisse cosě l'url della 
nuova pagina da richiamare.
Per esempio, nella pagina libri_06.htm se clicco il tasto avanti devo andare 
alla pagina libri_07.htm
Ovviamente per il tasto INDIETRO la stessa cosa: basta decrementare di 1.
Help! purtroppo non sono un genio in javascript  :"-( 

 e mi fornisse così l'url della nuova pagina da richiamare.
var url="libri_"+(numero.length==1?"0":"")+numero+".htm";
scritto al volo e con una terribile influenza ma più o meno la logica è
questa (o una delle logiche, si può fare in altri 100 modi)
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

Ok, e' chiaro e ci sono poche difficolta', ti do una mano:
l'unico problema che vedo e' come fare a fermarsi nell'incremento; infatti,
e' banale nel decremento se si raggiunge la pagina 1 o 0 non si puo' andare
piu' indietro, ma nell'altro caso?
L'unica cosa, essendo pagine statiche, mi sembra che sia settarlo in
qualche variabili... mi viene da pensare ad un unico file di Javascript
linkato da tutti questi file dove si e' salvato il massimo per ogni
tipologia di pagina a questo punto mettere anche il minimo perche' la
fatuica e' poca e un giorno potrebbe essere anche utile...
ad es.:
var type = { 'libri':[1,5], 'penne':[1,8], 'gomme':[1,3] };
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array
poi hai bisogno di parserizzare l'url del file estrapolando la parte di
nome e il numero, qui mi sembra che la soluzione migliore sia usare una
bella RegExp
ad es.:
var p = location.href.match( /\/(\w+)_(\d{2}).htm$/ );
se il file fosse 'libri_02.htm' avresti:
p[1] -> 'libri'
p[2] -> '02'
http://developer.mozilla.org/en/docs/DOM:window.location
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:RegExp
poi per incrementare e decrementare devi avere qualche accorgimento per
evitare risultati tipo '021'
ad es.:
var next = parseInt( p[2], 10 ) + 1;
var previous = p[2] - 1;
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Functions:parseInt
poi devi fare il controllo che i link rientrino nel range stabilito:
if( previous < type[p[1]][1] )
if( next > type[p[1]][2] )
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Statements:if...else
comportandoti di conseguenza tipicamente non visualizzando il link
ed infine se tutti i questi controlli ( e quelli che vuoi aggiungere ) sono
andati a buon fine, puoi inserire i link cosi':
document.write('<a href="'p[1] + '_'  + previous + '.htm">precedente</a>');
document.write('<a href="'p[1] + '_'  + next + '.htm">prossimo</a>');
http://developer.mozilla.org/en/docs/DOM:document.write
Lascio a te il compito di unire i vari pezzi rinominare un po' melgio le
variabili,
direi che la fatica dovrebbe essere poca :(
Cmq eventualmente siamo qui :)
Alla fine mi sa' che non mi sono limitato a darti una mano...
Ciao

 document.write('<a href="'p[1] + '_'  + next + '.htm">prossimo</a>');
ho dimenticato lo zero...
document.write('<a href="'p[1] + '_'  +
(previous<10)?'0':'' + previous +
'.htm">precedente</a>');
document.write('<a href="'p[1] + '_'  +
(next<10)?'0':'' + next +
'.htm">prossimo</a>');

 questa (o una delle logiche, si puň fare in altri 100 modi)
Cristiano ti dispiacerebbe lasciare una riga tra il testo quotato e la tua
risposta? E' parecchio che mi propongo di dirtelo.
Grazie
-- 
Quel vizio che ti uccidera' non sara' fumare o bere,
ma il qualcosa che ti porti dentro,
cioč vivere, vivere e poi vivere ...

 risposta? E' parecchio che mi propongo di dirtelo.
boh, se serve proverò a ricordarmelo (Dialog colora in colori diversi
quindi a me sembra chiarissimo...)
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 (Dialog colora in colori diversi quindi a me sembra chiarissimo...)
Considera che si sta lamentando uno che usa Dialog...

 '.htm">precedente</a>');
In realtà alla seconda riga mancavano due parentesi:
document.write('<a href="'p[1] + '_'  +
((previous<10)?'0':'') + previous +
'.htm">precedente</a>');
L'hai fatto apposta per farmi sfasciare la testa vero?
Grazie per l'aiuto, appena avrò finito di lottare col codice vi farò sapere 
:)
M.

 L'hai fatto apposta per farmi sfasciare la testa vero?
E dai, la pappa era quasi pronta :)

> E dai, la pappa era quasi pronta :)
Scherzavo... comunque ho fatto.
In un file .js (che ora sfrutterň anche per altro) ho inserito:
var p = location.href.match( /\/(\w+)_(\d{2}).htm$/ );
var next = parseInt( p[2], 10 ) + 1;
var previous = p[2] - 1;
Invece nelle pagine inserisco solo:
document.write('<a href="' + p[1] + '_'  + ((previous<10)?'0':'') + previous 
+ '.htm">precedente</a><br />');
document.write('<a href="' + p[1] + '_'  + ((next<10)?'0':'') + next + 
'.htm">prossimo</a><br />');
Il controllo prima e ultima pagina non lo metto (me le cambio a mano... lo 
so, č un po' grezzo, ma va bene lo stesso)
L'unico dubbio che mi rimane č se posso spostare piů codice sul .js, magari 
facendo una funzione e inserendo solo quest'ultima nelle pagine vere e 
proprie... comunque, dato anche il tempo a disposizione, quello che ho ora 
va piů che bene ;-)
M. :)

 proprie... 
esatto quella sarebbe la cosa migliore,
tu metti tutto nel tuo js compreso le due funzioni che ti scrivono il
codice del link
[js.js]
var p = location.href.match( /\/(\w+)_(\d{2}).htm$/ );
var next = parseInt( p[2], 10 ) + 1;
var previous = p[2] - 1;
function link_previous( )
{
  document.open();
  document.write('<a href="' + p[1] + '_'  +
     ((previous<10)?'0':'') + previous + '.htm">precedente</a>');
  document.close();
}
function link_next( )
{
  document.open();
  document.write('<a href="' + p[1] + '_'  + ((next<10)?'0':'') + next + 
     '.htm">prossimo</a>');
  document.close();
}
nelle pagine HTML non fai altro che mettere solo quelle 2 funzioni:
[html.htm]
....
<p>ciao</p>
<script type="text/javascript">link_previous( )</script>
<br>
<script type="text/javascript">link_next( )</script>
Chiaro?
Ciao

 Chiaro?
Tutto chiarissimo grazie!!! L'aiuto č stato fondamentale :-)
M.