Newsgroup: it.comp.lang.javascript
Titolo: ereditare onfocus

Se io setto sul padre
onfocus=function() {alert('ciao');};
e poi do il fuoco a uno dei figli, con Firefox l'evento viene eseguito, 
mentre con IE no.
C'e' un modo per aggirare il problema?
Si puo' fare insomma?
<div id="test">
<a href="#">
ciaoooo
</a>
</div>
<script>
var node = document.getElementById("test");
node.onfocus = function() {alert("ciao");};
</script>
cioe' se clicco su ciaoooo, con FF esce l'alert, con IE no.

 mentre con IE no.
è strano, a me sembra di ricordare che di default l'evento si propaga.
Comunque sia cerca con google cancelBubble/stopPropagation:
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/cancelbubble.asp
http://developer.mozilla.org/en/docs/DOM:event.stopPropagation
-- 
"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.


Forse allora e' perche' in IE gli elementi DIV non hanno un evento onfocus.

> Forse allora e' perche' in IE gli elementi DIV non hanno un evento onfocus.
Il che non e' poi cosi' assurdo...

 Il che non e' poi cosi' assurdo...
mica tanto, inoltre loro millantano di supportarlo:
http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/div.asp
 

 
http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/div.asp
 
http://www.w3.org/TR/html401/struct/global.html#edef-DIV
non presente
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.


si ma e' supportato da FireFox (ho provato) e quindi immagino tutti i 
browser gecko, e dovrebbe esserlo anche da IE secondo quanto dicono...invece 
non e' per  niente vero ;)


Premesso che non ha senso che onfocus funzioni (secondo me!)
Ho notato che se gli dai una dimensione ad 100x100
allora l'evento si "attiva"...
Prova un po'...

 ha scritto:

Forse onfocus funziona solo su elementi che "hanno un layout" (parlando di
IE, ovviamente). L'ho sparata, eh, è da verificare!
-- 
Nando [?]
Apostolo della Prova

 IE, ovviamente).
Mhm. E un input ti sembra che abbia un layout? :)
Ho capito cosa intendi, ma detta cosě č proprio fuorviante.
-- 
"E' un vero peccato che tutte le persone che sanno come far funzionare 
il Paese siano troppo occupate a guidare taxi o a tagliare capelli."
(George Burns)

 Prova un po'...
Puo' essere utile se sfrutti il bubbling (termine appena imparato! eheh).
Cioe' se vuoi raccogliere l'evento onfocus di uno dei suoi figli qualsiasi, 
cosi' non devi settare onfocus su tutti i figli. 

 allora l'evento si "attiva"...
Non c'entra nulla la dimensione di "100x100"; se anche gli dai solo width di
1px, diventa recettivo al focus.
Oppure se imposti position absolute; e via dicendo.
Sembrerebbe che IE attivi la gestione di certi event-handler su alcuni
elementi solo se a livello di rendering questi non sono considerati "elementi
di contorno".


 Ho capito cosa intendi, ma detta cosě č proprio fuorviante.
Mi sono espresso male, come al solito :)



ma come avete fatto ad attivarlo? io non ci riesco!
Ho provato con questo (seguendo l'indicazione della dimension poi smentita 
da te):
<div id="test" style="width:200;height:200;background-color:red;" 
onfocus="alert('ff');">
  <a href="#" id="link">Hello World</a>
</div>
ma quando clicco sul link non si attiva il focus sul div.

 style="width:200;height:200
200px forse va un po' meglio :)


 style="width:200;height:200
200px forse va un po' meglio :)
Ah, ho verificato: è come dicevo, l'onfocus funziona se l'elemento ha
layout. Ti basta impostare height:1px *solo* per explorer.



ecco non avevo capita una mazza di cosa intendevate con avere il layout ;).
Grazie. 

 Sě, ce l'ha:
Ma se ti riferisci al metodo proprietario di IE "hasLayout", perché me lo
"traduci" in italiano mettendolo tra parentesi?
Quello che traspare č che tu parli di layout come concetto.


 Sě, ce l'ha:
Ma se ti riferisci al metodo proprietario di IE "hasLayout", perché me lo
"traduci" in italiano mettendolo tra doppi apici?
Quello che traspare č che tu parli di layout come concetto.
-- 


 ecco non avevo capita una mazza di cosa intendevate con avere il layout ;).
Colpa di Nando che non si sa esprimere :P



Pero' non mi eredita l'onfocus al padre (il div).
Dovrebbe chiamarsi bubbling e dovrebbe anche essere supportato da IE.
<div id="test" style="background-color:red;height:100px;width:100px;" 
onfocus="alert('ff');">
aaaaaaaaaaaaa
  <a href="#" id="link">Hello World</a>
</div>
Cioe' non esce l'alert se clicco sul link contenuto nel div.
Mentre esce l'alert se clicco su "aaaaaaaaaaaa".

 ma quando clicco sul link non si attiva il focus sul div.
Per due motivi: primo, se sei in compatMode, hai dimenticato le misure in
pixel, ergo non stai impostando alcunché.
Secondo, il div ora recepisce sě il focus, ma non viene propagato nel medesimo
modo di Firefox.


 Quello che traspare è che tu parli di layout come concetto.
E l'ho detto che "mi sono espresso male"... comunque la proprietà
"Retrieves a value that indicates whether the object has layout", da cui la
traduzione :)


 Colpa di Nando che non si sa esprimere :P
Umpf :-/


 traduzione :)
E ribadisco, perché la devi tradurre? :) Poi si ottiene i risultati che hai
visto.


 Oppure se imposti position absolute; e via dicendo.
Si' si',
mi e' rimasta "nella tastiera" una parte di frase, doveva essere:
"che se gli dai una dimensione, ad es: 100x100px"...
                              ^^^^^^^^

aaaaaaaaaaaa<input type="text" /><a href="#">link</a></div>
document.getElementById("test").addEventListener("focus",
function(){alert("ff");},true);
Vedrai che l'alert verrà mostrato anche sul textbox. Questo perché cambia
completamente l'ordine di propagazione, e quindi anche se alcuni elementi per
default non propagano verso l'alto determinati event-handler (come nel caso
del campo input), in questo modo aggiri il problema perché scorri il percorso
dei nodi al "contrario".
Per avere un'idea più chiara della cosa:
http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-flow


 visto.
Cheppalle! Sempre ragione tocca darti!
:-)



Cioe' l'evento "focus" viene propagato in fase di capturing solo per alcuni 
elementi (i link ad esempio), mentre per altri no (gli input)?
Comunque svelando le carte, la porcheria che vorrei fare e' questa:
<form>
<div>
....
</div>
</form>
dentro il div ci possono stare elementi qualsiasi, link e bottoni compresi, 
che pero' interagiscono con il server sempre e soltanto chiamando 
"form.submit();".
Partendo da questo presupposto, vorrei che quando uno clicca uno di questi 
elementi anziche' fare il submit si eseguisse una mia funzione (questo deve 
valere solo per gli elementi contenuti dentro il "div").
Usando "onmouseover" e "onmouseout" sul div riesco a farlo, pero' si pone il 
problema che l'utente potrebbe azionare quegli elementi usando la tastiera 
invece.
Quindi mi era venuta l'idea di usare l'evento "focus", che pero' a 
differenza di "onmouseover" non viene propagato anche in fase di bubbling 
(come descritto dalla tabella del W3C suggeritami da Zero), da qui 
l'apparente problema insormontabile con il browser IE.
Altre idee?  ;)

 Altre idee?  ;)
Usare onclick pare brutto? :)



Gia', il bello e' che l'avevo anche provato, ma non ricordo per quale motivo 
l'ho scartato (mi sa che ero in stato confusionario)...devo essere 
particolarmente stupido ;)
Almeno ho imparato qualcosa di nuovo, dai.