Newsgroup: it.comp.lang.javascript
Titolo: Focus ??

Salve ragazzi,
 
ho un form che contiene codice e descrizione e quantita
 
via javascript aggiorno le quantita con una immagine (+ e - ) e ad ogni 
click effettuo un submit del form (quindi rinfresco della pagina)
 
 
volevo chiedervi č possibile dopo il post posizionarmi sulla text box 
modificata? magari sfruttando il focus o qualche altro evento ?.
 
il problema č che quando ci sono n record perdo il riferimento e devo usare 
la barra di scorrimento per riprendere il record modificato.
 
Quindi a livello usabilty č scomodo.
 
 
 
Pensavo di usare qualcosa come le etichette di  html...dipo <a 
name="puntaqui"></a>   e quando <a href="#" name="puntaqui">clicca qui</a>
 
č possibile?
 

 è possibile?
 
Se la textbox ha un id, puoi usare quello, passarlo nella query string,
e poi usare quello con `getElementById` per prendere il riferimento e
invocare il metodo `focus`.
Detto questo, mi pare tutto un po' troppo scomodo, e solitamente non è
così che si fa.
 
Anche se tu dovessi obbligatoriamente contattare il server ogni volta
che vari la quantità, puoi fare il tuo "post" tramite XMLHttpRequest, e
quindi la pagina ti rimane esattamente lì dov'è, dato che non la
ricarichi completamente.

 
 
"ZER0"  ha scritto nel messaggio 
news:4EBADAC6...@ID-171124.news.individual.net...
 
Hai perfettamente ragione in tutto ciò che dici,
la motivazione che mi aveva spinto a prendere questa decisione (che vorrei 
cambiare)
era legato al fatto che ho una pagina con due iframe dove il bottone OK sta 
nella pagina contenitore
questa struttura
 
<form action="Pagina1.asp" method="post" id="FormReg" name="FormReg"
 
 
<iframe name="Pagina1_1" src="xxxx">
 
<iframe name="Pagina1_2" src="xxx">
 
 
<input type="submit" id="OK" name="OK" value="OK"
 
</form>
 
dentro il iframe Pagina1_1 ho il mio + e - a questo punto per ottenere una 
migliore usability e il posizionamento.
 
dovrei aggiornare i campi inseriti quando clicco su OK.
 
ma in questo modo perdo i riferimenti al iframe1 giusto? 
 

 dovrei aggiornare i campi inseriti quando clicco su OK.
 
Non ti seguo molto bene, scusami. Non conoscendo tutti gli antefatti, e
soprattutto perché hai dovuto "suddividere" una form in un frame
differenti, non mi è facile consigliarti.
Continuo a non capire, ad esempio, come mai cliccando sui pulsanti + e -
devi fare una post al server. Non ti basta aggiornare il valore tramite
JavaScript client side? Ammesso che tu non possa / voglia mettere la
form in un'unica pagina, puoi sempre avere dei campi hidden nella pagina
contenitore che vengono aggiornati quando clicchi i pulsanti + e -. Così
quando clicchi su OK vengono mandati anche quelli.
 
L'unica ragione che mi possa venire in mente del perché tu abbia creato
così tanti iframe, che contengono "porzioni" logiche della form, è per
non ricaricare l'intera pagina contenitore in certe operazioni che
coinvolgono il server e solo una porzione della form. Ma ti ripeto che,
in tal caso, puoi tranquillamente fare una richiesta HTTP al server
senza dover ricaricare alcunché, usando XMLHttpRequest.

senza dover ricaricare alcunché, usando XMLHttpRequest.
 
capisco benissimo che la problematica è "contorta" ma a volte ti trovi a 
dover trovare soluzioni su
problematiche "rigide" :-)
 
Purtroppo l'unica soluzione è sapere come far comunicare iframe con il suo 
contenitore....
 
se uso iframe sulla pagina contenitrice  nn ho alcun modo di richiamare gli 
elementi della pagina iframe?
<form action="Pagina1.asp" method="post" id="FormReg" name="FormReg"
<iframe name="Pagina1_1" src="xxxx">
<iframe name="Pagina1_2" src="xxx">
<input type="submit" id="OK" name="OK" value="OK"
</form>
cioe io mi trovo sulla pagina1.asp e vorrei "leggermi" gli elementi 
modificati (con + e -  senza post) della pagina dentro l'iframe Pagina1_1
 
 
 
utilizzando jquery load (tecnologia XMLHttpRequest)
carico sulla pagina Pagina1.asp
 
due div dove carico due file
 
ho il problema che la pagina caricata (contiene centinai di record ) e si 
estenderebbe tutta senza farmi comparire le scroll bar...
 
l'esigenza dei due iframe nasce perchè ho centinaia di record dentro ognuno 
dei due iframe .....e la visuale deve essere vederne su una stessa pagina 10 
del primo e 5 del secondo
(fermo restando che con la barra di scorrimento è possibile vedere tutti gli 
altri)
 
 
 
 
 
 
 

 gli altri)
 
In questo caso onestamente non userei neanche le scrollbar. Se per
default devono essere visti solo i primi 10 e i primi 5, e solo
eventualmente altri, io visualizzerei solo i primi 10 e i primi 5 (senza
buttarli tutti in un div / iframe con scrollbar, perché anche se imposti
l'altezza in modo tale che ne visualizzi solo un tot, non puoi mai
essere sicuro: l'utente potrebbe avere una dimensione di font
differente, ergo ti sballa ogni cosa), tenendo gli altri nascosti. Poi,
con un link con label tipo "more", fare visualizzare i successivi nel
caso quei 10 / 5 all'utente non vada bene. E solo allora fai comparire
scrollbar e tutto il resto. Va da sé che non conoscendo lo use case, non
posso fare un analisi di usabilità a modo, questi son solo suggerimenti. :)

 </form>
 
dentro Articoli.asp
<form action="Articoli.asp" method="post" ID="form_Offerta" 
name="form_Offerta" >
 
    <input type="text" name="QuantitaOfferta1" id="QuantitaOfferta1"
 
io ho usato :
    alert(window.frames["Articoli"].document.forms[0].QuantitaOfferta1.value)
 
cosa può essere?
 
 
 

 alert(window.frames["Articoli"].document.forms[0].QuantitaOfferta1.value)
 
Intanto cambia il discorso name / id. Seconda di poi, questo codice deve
essere eseguito nella pagina che contiene gli iframe. Terzo, deve essere
eseguito quando il DOM è stato caricato nella pagina. Quindi, per fare
qualche piccola operazione di debug:
 
    window.onload = function() {
        alert(window.frames.length)
        alert(window.frames["Articoli"]);
        alert(window.frames["Articoli"].document);
    }
 
E vedi un po' che ti dice.

       alert(window.frames["Articoli"]);
  >      alert(window.frames["Articoli"].document);
  >  }
 
 
Ho provato cio che mi dici in pratica funziona solo se
alla pressione di OK io metto questa sintassi
 
window.onload = function() {
alert(window.frames["Articoli"].document.forms[0].QuantitaOfferta1.value);
}
 
se metto solo
alert(window.frames["Articoli"].document.forms[0].QuantitaOfferta1.value);
 
mi da errore.
 
cosa può essere?
 
fermo restando che ho risolto la problematica cmq....ma era per capire.... 
 

 }
 
Mi suona strano che mettendo questo alla pressione di OK ti "funzioni",
dato che qui stai solo definendo una funzione, non la stai invocando.
Hai probabilmente qualche problema da un punto di vista di caricamento
frames / struttura pagina.
 
Uno dei motivi per cui ti avevo suggerito che fosse il frame a impostare
dei valori in campi hidden della pagina contenitore, e non la pagina
contenitore a contattare il frame, era proprio per evitare race
condition. Dato che hai diversi frame, non vengono caricati tutti
contemporaneamente, e quindi manipolarli quando ancora non sono caricati
ti da errore (vedi il document non definito).
Ricorda inoltre che l'uso di frame ti modifica la history.
 
Personalmente credo che la cosa migliore sia evitare l'uso di iframe, da
come mi hai spiegato la casistica la cosa migliore � semplicemente usare
dei div con scrollbar.

 }
capisco, vedrò cosa posso fare,
 
invece perseguendo questa strada ....
 
se io nn avessi 1 form ma n form dentro iframe  Articoli, dovrei specificare 
il nome del form giusto?
 
la sintassi dovrebbe essere questa ?
 
window.frames["Articoli"].document.form_Offerta("QuantitaOfferta"+i).value
 
dove i è il numero di elementi che mi devo leggere
 
 
ho provato cosi con elemento forms[0] ma sbaglio qualcosa....
 
    for(var i=0; 
i<window.frames["Articoli"].document.forms[0].Elementi.value; i++) {
 
                alert(window.frames["Articoli"].document.forms[0].("QuantitaOfferta"+i).value);
            }
        }
 

 dove i è il numero di elementi che mi devo leggere
 
Ti ho già detto che non hai bisogno di un incrementale, stai "emulando"
malamente una caratteristica che il browser già ti mette a disposizione,
e lo fa anche bene. Quindi se hai:
 
    <input type="text" name="QuantitaOfferta" />
    ..
    <input type="text" name="QuantitaOfferta" />
    .. etc ..
 
Puoi fare:
 
    var form = window.frames["Articoli"].document.forms[0];
 
    var texts = form.QuantitaOfferta;
 
    for (var i=0; i < texts.length; i++) {
        alert(texts[i].value);
    }
 
Se hai diverse form, puoi usare sia il suo indice:
 
    var form = window.frames["Articoli"].document.forms[0]; // prima
 
    var form = window.frames["Articoli"].document.forms[1]; // seconda
 
Che il `name`:
 
    var form = window.frames["Articoli"].document.forms["myForm"];
 
    var form = window.frames["Articoli"].document.myForm;
 
Puoi anche usare l'id, volendo, usando `document.getElementById`
(ovviamente sempre con il riferimento alla window corretta).

semplicemente non li avresti nell'altro caso.
 
:-( hai ragione!!!
 
mentre parlavi di riferimenti a frame mi č venuto un dubbio....
 
considera questa struttura (obsoleta)
 
<frameset
           <frame name="Sopra"  >
            <frame name="central"  src="abc.htm">
            <frame name="bottom" >
</framset
 
 
abc.htm contiene:
 
<frameset >
    <frameset >
        <frame name="left1" >
        <frame name="left2" >
    </frameset>
    <frame name="principale" >
</frameset>
 
 
io mi trovo in una popup e aggiorno il contenuto del frame di nome "Sopra"
con questa sintassi:
 
opener.top.frames['Sopra'].location.href =  'xxx.htm'
 
la domanda č
 
se dovessi aggiornare il frame di nome principale magari con refresh anzichč 
location.href che riferimento dovrei prendere?
 
 
 
 
 
 


 
Ovviamente `window` deve essere sostituito con il riferimento alla
`window` di cui ti interessa modificare la location.

domanda da solo:
 
opener.top.opener.top.frames['central'] ho il riferimento al frame di nome 
central del frame principale
 
io per logica mi aspetterei di scrivere cosi per riferirmi al frame 
contenuto da central, anche se so che darà errore...
 
opener.top.opener.top.frames['central'].frames['principale']
 
me lo faaaaaaaa non ci posso credere!!!! :-)
 
opener.top.opener.top.frames['central'].frames['principale'].window.location.reload(true);
 
 
 
 
 
 

 opener.top.opener.top.frames['central'].frames['principale'].window.location.reload(true);
 
ammesso e concesso che tutto questo ti serva, conta che:
 
    opener.top.opener.top.frames["central"].frames["principale"]
 
è già un riferimento a `window`, non hai bisogno di fare:
 
    opener.top.opener.top.frames["central"].frames["principale"].window
 
Puo tranquillamente accedere a location da lì:
 
    var win = opener.top.opener.frames["central"].frames["principale"];
 
    win.location.reload(true);
 
Come si è già detto in questo NG, l'oggetto globale JavaScript nei
browser è `window`:
 
    <script>
        alert(this) // Window
 
        var foo = "bar";
 
        alert(this.foo) // "bar"
 
        alert(foo === this.foo) // true
    </script>
 
L'oggetto `window` mette a disposizione una proprietà `window` che punta
a sé stesso, quindi puoi fare anche:
 
    <script>
        alert(window === this) // true
 
        alert(this.window === this) // true
 
        alert(this.window === window) // true
 
        alert(window.window.window === window) // true
    </script>
 
Questo per dirti che volendo avresti potuto continuare all'infinito:
 
    window.window.window.window.location.reload(true);
 
Ma questo non vuol dire che sia giusto. ;)