Newsgroup: it.comp.lang.javascript
Titolo: Problema con focus

Ciao.
Ho creato una struttura di questo tipo:
Pagina:
-----------------------------------------------
<form..... class="loading">
    ...
</form>
<script type="text/javascript">
    document.getElementById("frmMain").style.visibility = "visible";
</script>
WebForm_AutoFocus(ElementID);
-----------------------------------------------
Il problema č l'elemento indicato da ElementID non riceve il focus,
penso che dipenda dal fatto che la funzione 
WebForm_IsInVisibleContainer(ctrl)
restituisca false.
Qualcuno sa suggerire una solzione?
Credo che sě debba modificare lo script che segue il form
ma non capisco come mai la validazione fallisca.
Utilizzo 
ASP.NET
 2.0.
CSS
-----------------------------------------------
.loading{
    visibility: hidden;
}
-----------------------------------------------
JS
-----------------------------------------------
function WebForm_FindFirstFocusableChild(control) {
    if (control == null || control.tagName == null) {
        return null;
    }
    var tagName = control.tagName.toLowerCase();
    if (tagName == "undefined") {
        return null;
    }
    var children = control.childNodes;
    if (children != null) {
        for (var i = 0; i < children.length; i++) {
            try {
                if (WebForm_CanFocus(children[i])) {
                    return children[i];
                }
                else {
                    var focused = 
WebForm_FindFirstFocusableChild(children[i]);
                    if (WebForm_CanFocus(focused)) {
                        return focused;
                    }
                }
            } catch (e) {
            }
        }
    }
    return null;
}
function WebForm_AutoFocus(focusId) {
    var targetControl;
    if (__nonMSDOMBrowser) {
        targetControl = document.getElementById(focusId);
    }
    else {
        targetControl = document.all[focusId];
    }
    var focused = targetControl;
    if (targetControl != null && (!WebForm_CanFocus(targetControl)) ) {
        focused = WebForm_FindFirstFocusableChild(targetControl);
    }
    if (focused != null) {
        try {
            focused.focus();
            if (__nonMSDOMBrowser) {
                focused.scrollIntoView(false);
            }
            if (window.__smartNav != null) {
                window.__smartNav.ae = 
focused.id
;
            }
        }
        catch (e) {
        }
    }
}
function WebForm_CanFocus(element) {
    if (element == null || element.tagName == null) return false;
    var tagName = element.tagName.toLowerCase();
    return ((element.disabled == null || element.disabled == false) &&
            (element.type == null || element.type.toLowerCase() != "hidden") 
&&
            WebForm_IsFocusableTag(tagName) &&
            WebForm_IsInVisibleContainer(element)
            );
}
function WebForm_IsFocusableTag(tagName) {
    return (tagName == "input" ||
            tagName == "textarea" ||
            tagName == "select" ||
            tagName == "button" ||
            tagName == "a");
}
function WebForm_IsInVisibleContainer(ctrl) {
    if (ctrl.disabled == true ||
        ( typeof(ctrl.style) != "undefined" &&
          ( ( typeof(ctrl.style.display) != "undefined" &&
              ctrl.style.display == "none") ||
            ( typeof(ctrl.style.visibility) != "undefined" &&
              ctrl.style.visibility == "hidden") ) ) ) {
        return false;
    }
    else if (typeof(ctrl.parentNode) != "undefined" &&
             ctrl.parentNode != null &&
             ctrl.parentNode != ctrl) {
        return WebForm_IsInVisibleContainer(ctrl.parentNode);
    }
    return true;
}
-----------------------------------------------
Grazie,
Matteo Migliore.

 function WebForm_FindFirstFocusableChild(control) {
[CUT]
Sant'iddio, mi sembra quello che per accendere una sigaretta usa il
lanciafiamme!
Lo scopo è quello di nascondere la form e visualizzarla solo dopo averla
completamente caricata?
Ma un qualcosa del tipo
 <script type="text/javascript">
  window.onload=function() {
   document.getElementById("frmMain").style.visibility = "visible";
   document.getElementById("frmMail").elements['namedeltuoinput'].focus();
  }
non basta?
non ho mai provato, dovesse trovarsi ancora in stato di non visibile
(stranissimo!) al massimo metti un setTimeout così dai respiro, del tipo
 setTimeout("document.get....focus()",1);
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.

 setTimeout("document.get....focus()",1);
Questo non dovrebbe cambiare molto,
al massimo peggiora la situazione, visto
che la funzione di assegnamento del focus
viene richiamata dopo aver rimesso la form visibile.
Cosa dici?
Grazie!
Matteo Migliore.

 Cosa dici?
Che non mi metto certo a studiare uno script di 150 righe per fare una cosa
che si fa in una riga...
a parte che:
 if (__nonMSDOMBrowser) {
        targetControl = document.getElementById(focusId);
    }
    else {
        targetControl = document.all[focusId];
    }
 Mi scrivono una spataffiata simile e poi escludono a priori netscape4?
 
Ma se richiami questa autofocus window.onload il problema è lo stesso? a me
sembra così strano...
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 sembra cosě strano...
Non capisco.
La funzione viene richiamata "in fondo" alla pagina, viene renderizzata 
dall'engine
in quella posizione.
Secondo me dovrei agire sulle proprietŕ style della form.
Purtroppo il file js che il FW aggiunge alla pagina
sě trovano all'interno di assembly che non č possibile modificare :-(
quindi non č piů possibile, come sě tentava di fare nel 1.1, modificare
i file js dei validator per renderli crossbrowser.
Matteo Migliore. 

         return WebForm_IsInVisibleContainer(ctrl.parentNode);
Questa? Risale di contenitore in contenitore e verifica che ce ne sia
almeno uno hidden o none...ma a naso non sembrerebbe proprio il tuo caso.
Visto che la curiosità regna padrona ho copiaincollato qua:
 
http://www.criosoftware.it/bak/AutoFocusNet2.htm
(ho aggiunto le righe 
   ElementID="ElementID";
  __nonMSDOMBrowser=false;
). E in effetti di focus manco l'ombra...si vede lampeggiare il focus() per
un attimo ma poi si toglie.
Verifico allora come ti ho suggerito:
  window.onload=function() {WebForm_AutoFocus(ElementID)}
e funziona correttamente (vedi te stesso la pagina sopra indicata).
Infine provo anche a usare il setTimeout (lasciato in rem nella pagina
sopra indicata) => funziona anche questo.
Riassunto: ha bisogno di "respiro" per settare le proprietà del tag form,
immagino (o per chissà quale altro motivo) => o lo fai onload (del resto
normalmente è così che si fa per messaggi tipo "attendere, caricamento in
corso" o simili) o con setTimeout (che a naso in pratica sarebbe la stessa
cosa, perché lo eseguirebbe non appena ha terminato di caricare la pagina
completamente), altrimenti viene ignorato.
Tutto quanto sopra con IE6sp1 Eng.
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 Possibile???[/OT]
CTRL+F, "Find Text In.. Article Body Pane".
Questo intendevi?
-- 
~ "Nell'anno 1969 č bastata la potenza di calcolo di due Commodore 64 per
mandare con successo una navicella sulla Luna. Nell'anno 2003 č
necessario un Pentium 4 a 2000 Mhz per far funzionare Windows XP.
Qualcosa deve essere andato storto."

 Tutto quanto sopra con IE6sp1 Eng.
Ho provato con l'onload e funziona come dici.
Non mi resta che far sì che funzioni sempre, nell'esempio
hai richiamato Webform_AutoFocus con un ID fisso.
Il problema adesso è stabilire a quale controllo è stato assegnato il focus.
Speriamo di farcela, mi sembra che il FW valorizzi un membro privato
a cui non è possibile accedere, ma controllo meglio e ti faccio sapere.
Grazie,
Matteo Migliore.

 CTRL+F, "Find Text In.. Article Body Pane".
Sě, forse non ho scritto tutto (al solito!), io stavo rispondendo alla mail
e volevo copiaincollare alcune parti. Mi sono accorto che dalla finestra di
risposta il ctrl-F non funziona.
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

 gli script lato client, cerchi sempre di arrivare alla soluzione.
Eh, un po' di curiosità, un po' serve anche a me.
Non mi è ben chiaro perché si comporti così, comunque...gli altri hanno
qualche idea? 
Per chi non ha seguito l'immenso thread: form visibility="hidden", al
termine della pagina (ma prima di window.onload) setta
visibility="visible", subito dopo focus su una textbox => non va (non
segnala errore, lampeggia focus() per un istante e poi si perde). 
Stesso giro window.onload va. Stesso giro con setTimeout sul focus va.
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 gli script lato client
da dove hai dedotto questa affermazione molto forte "quasi"? :-/


 da dove hai dedotto questa affermazione molto forte "quasi"? :-/
Da precenti discussioni, ad esempio:
- validators
- smartnavigation (che comunque sì è rivelata un flop)
- focus (questa)
Sono sicuro che se controllerai il codice prodotto
da TreeView e Menu (sempre FW 2.0) non faranno
una bella fine neanche quelli :-)
Quindi...
Matteo Migliore. 

 risposta il ctrl-F non funziona.
Non sono sicuro di aver capito bene cosa intendi, cmq se vuoi cercare
DENTRO la finestra di risposta, non c'č la shortcut devi passare dal menų
(Edit->Find).


 segnala errore, lampeggia focus() per un istante e poi si perde). 
Sono andato sul link da te pubblicato, ho preso il sorgente della pagina e
modificato i commenti nel seguente modo:
	WebForm_AutoFocus(ElementID);
	//window.onload=function() {WebForm_AutoFocus(ElementID)}
	//setTimeout("WebForm_AutoFocus(ElementID)",1);
Cosě facendo, se ho ben capito, avrei dovuto replicare l'anomalia da te
sopradescritta. Invece, mi funziona tutto, esattamente come per l'onload
(Win2k, IE6sp1).
Quindi, o ho sbagliato qualcosa io nel cercare di replicare l'errore,
oppure sulla mia macchina tale errore non succede.
Nel primo caso, ditemi cosa devo fare e vedo di farlo.
Se invece si tratta del secondo caso, chiedo a voi di fare una prova:
mantenendo il codice che NON funziona (ovvero la prima riga, non quella che
fa uso di onload / timeout), se nella classe css si imposta come valore
"visible" invece che "hidden", l'anomalia c'č ancora oppure scompare?


 (Edit->Find).
Sě, intendo che in questo momento ti sto rispondendo, il tuo messaggio era
molto lungo cosě dico "vediamo dove si trova questa parola"...Nel menů Edit
non ho "find"...
-- 
"e mai che mi sia venuto in mente
 di essere piů ubriaco di voi
 di essere molto piů ubriaco di voi"
									  F.D.A.

 - focus (questa)
Appunto..."quasi" sottintende che ho visto un codice js generato da .net
che ho detto "carino questo, mò lo uso"...non mi risulta proprio per ora
:-)
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is down
 don't sit down, it's time to dig another one"
									    P.F.

 non ho "find"...
Puň darsi che dipenda dalla versione di Dialog, vedo che la tua č piů
vecchia della mia... Scaricati quella nuova.


 "visible" invece che "hidden", l'anomalia c'č ancora oppure scompare?
Stessa cosa.
Ma penso di aver trovato l'arcano (non il perché, ma come riprodurlo): F5!
Prova un po' adesso il codice: apri la pagina ed effettivamente il focus()
viene settato, se premi F5 no (e io tutte le prove le ho fatte con F5); se
clicchi sull'URL e premi invio invece funziona. con window.onload o
setTimeout funziona sempre (anche con F5).


 Ma penso di aver trovato l'arcano (non il perché, ma come riprodurlo): F5!
Niente da fare. Imperterrito, continua a funzionare. L'unica cosa che
succede, è che la  textbox durante il "reload" pare ridursi un poco di
dimensioni... l'ho provato più volte perché lì per lì non ci volevo
credere. :) Suppongo dipenda dal fatto che non sono state impostate delle
dimensioni sull'elemento, ma ignoro il perché la prima volta abbia una
lunghezza e la seconda un'altra... Ah, misteri della microsoft.
-- 
~ "Nell'anno 1969 è bastata la potenza di calcolo di due Commodore 64 per
mandare con successo una navicella sulla Luna. Nell'anno 2003 è


 dimensioni... 
Continuo a dirtelo: *smettila di bere cazzo*, almeno al lavoro!!! :-) 
ho verificato, a me questo in compenso non succede. 
A questo punto proseguiamo: hai tutte le patch installate da windowupdate?
Comunque sia č "carino" che Microsoft faccia uno script solo per IE (anche
se casualmente potrebbe andare anche con Gecko, ma sono sicuro sia un
caso), spara lo script nella pagina anziché onload (pratica che
personalmente ho sempre evitato) e poi ci sono queste incongruenze...passi
se lo faccio io, passi se lo fa Matteo, ma sant'iddio...


 se lo faccio io, passi se lo fa Matteo, ma sant'iddio...
Ehò, non so che dirti.. la penso come te.


 fegato)... :)
:-) io ci ho provato poche volte a programmare con sostanze alteranti in
corpo, iniziavo "foreach(pinco in pallo).....solitario!" acc riprova
"if(1==0)...heart!!" ... impossibile!
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 "if(1==0)...heart!!" ... impossibile!
Ehehe.. no, io invece ho la netta sensazione che con la giusta quantità di
alcol in corpo, andrei come le palle di fuoco (dato che ho avuto
"avvisaglie" di ciò, un paio di volte)...!


 vecchia della mia... Scaricati quella nuova.
Aggiornata, tutto ok adesso (comparso il Find/Find Next), danke.


 Aggiornata, tutto ok adesso (comparso il Find/Find Next), danke.
Tutto ok una cippola, non mi scarica più gli header ogni minuto. Sembra non
funzionare più il Timer:
program OnTimer2;
procedure OnTimer2;
begin
  ADo('GetNewHeadersInSubscribedGroups');
end;
begin
end.
Boh...dicevo "strano nessun messaggio", doppio click a manina, in 4
newsgroup un totale di 47! Boh, domani ci indago meglio.


 funzionare più il Timer:
Per i posteri: occorre aprire Dialog, ricompilare tutti gli script,
chiuderlo e riaprirlo.
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.