Newsgroup: it.comp.lang.javascript
Titolo: Gestori eventi

Ciao.
Che evento č possibile utilizzare alternativamente
a onload che venga sempre richiamato, anche in seguito
ad un submit della pagina?
Utilizzo questa funzione per aggiungere i gestori
d'evento alla pagina:
----------------------------------------------------
function addHandler(Target, theEvent, Handler, Parameters, useCapture ){
eval("var onTarget = Target.on" + theEvent + ";");
FunctionSignature = Handler + "('" + Parameters + "')";
EvHandler = new Function(FunctionSignature);
if (Target.addEventListener) {
Target.addEventListener(theEvent, EvHandler, useCapture);
} else if (Target.attachEvent) {
Target.attachEvent("on" + theEvent, EvHandler);
} else if (onTarget) {
onTarget = function piggyback() {
onTarget();
Handler();
};
} else { onTarget = Handler(); }
return true;
}
Il codice per richiamarla č:
addHandler(window, 'load', 'initResizing', '', false);
----------------------------------------------------
Quando eseguo il postback il codice non viene eseguito.
La riga di codice interessata in IE č
Target.attachEvent("on" + theEvent, EvHandler),
sembra che non venga aggiunto il gestore.
Grazie,
Matteo Migliore. 

 Quando eseguo il postback il codice non viene eseguito.
Il codice in ogni caso viene eseguito a caricamento avvenuto, non
immediatamente dopo il post.
-- 
ZER0
~ The Tangent Universe collapsed 5995 days, 3 hours, 1 minutes and 28 seconds ago.

 immediatamente dopo il post.
Non so se utilizzi tecnologie server e se utilizzi 
ASP.NET
,
il problema veniva generato da una proprietà, SmartNavigation,
che consente di ricaricare la pagina senza "sfarfallii"
tra i vari postback.
Ti posto il codice che implementa questa "magia" :-D:
------------------------------------------------------------------------------------------------
var snSrc;
if (window.__smartNav == null)
{
    window.__smartNav = new Object();
    window.__smartNav.update = function()
    {
        var sn = window.__smartNav;
        var fd;
        document.detachEvent("onstop", sn.stopHif);
        sn.inPost = false;
        try { fd = frames["__hifSmartNav"].document; } catch (e) {return;}
        var fdr = fd.getElementsByTagName("asp_smartnav_rdir");
        if (fdr.length > 0)
        {
            if (sn.sHif == null)
            {
                sn.sHif = document.createElement("IFRAME");
 
sn.sHif.name
 = "__hifSmartNav";
                sn.sHif.style.display = "none";
                sn.sHif.src = snSrc;
            }
            try {window.location = fdr[0].url;} catch (e) {};
            return;
        }
        var fdurl = fd.location.href;
        index = fdurl.indexOf(snSrc);
        if ((index != -1 && index == fdurl.length-snSrc.length)
            || fdurl == "about:blank")
            return;
        if (sn.sHif != null)
        {
            sn.sHif.removeNode(true);
            sn.sHif = null;
        }
        var hdm = document.getElementsByTagName("head")[0];
        var hk = hdm.childNodes;
        var tt = null;
        for (var i = hk.length - 1; i>= 0; i--)
        {
            if (hk[i].tagName == "TITLE")
            {
                tt = hk[i].outerHTML;
                continue;
            }
            if (hk[i].tagName != "BASEFONT" || hk[i].innerHTML.length == 0)
                hdm.removeChild(hdm.childNodes[i]);
        }
        var kids = fd.getElementsByTagName("head")[0].childNodes;
        for (var i = 0; i < kids.length; i++)
        {
            var tn = kids[i].tagName;
            var k = document.createElement(tn);
 
k.id
 = kids[i].id;
            k.mergeAttributes(kids[i]);
            switch(tn)
            {
            case "TITLE":
                if (tt == kids[i].outerHTML)
                    continue;
                k.innerText = kids[i].text;
                hdm.insertAdjacentElement("afterbegin", k);
                continue;
            case "BASEFONT" :
                if (kids[i].innerHTML.length > 0)
                    continue;
                break;
            default:
                var o = document.createElement("BODY");
                o.innerHTML = "<BODY>" + kids[i].outerHTML + "</BODY>";
                k = o.firstChild;
                break;
            }
            if(k!=null)
                hdm.appendChild(k);
        }
        document.body.clearAttributes();
 
document.body.id
 = 
fd.body.id
;
        document.body.mergeAttributes(fd.body);
        var newBodyLoad = fd.body.onload;
        if (newBodyLoad != null)
            document.body.onload = newBodyLoad;
        var s = "<BODY>" + fd.body.innerHTML + "</BODY>";
        if (sn.hif != null)
        {
            var hifP = sn.hif.parentElement;
            if (hifP != null)
                sn.sHif=hifP.removeChild(sn.hif);
        }
        document.body.innerHTML = s;
        var sc = document.scripts;
        for (var i = 0; i < sc.length; i++)
        {
            sc[i].text = sc[i].text;
        }
        sn.hif = document.all("__hifSmartNav");
        if (sn.hif != null)
        {
            var hif = sn.hif;
            sn.hifName = "__hifSmartNav" + (new Date()).getTime();
            frames["__hifSmartNav"].name = sn.hifName;
            sn.hifDoc = hif.contentWindow.document;
            if (sn.ie5)
                hif.parentElement.removeChild(hif);
            window.setTimeout(sn.restoreFocus,0);
        }
        if (typeof(window.onload) == "string")
        {
            try { eval(window.onload) } catch (e) {};
        }
        else if (window.onload != null)
        {
            try { window.onload() } catch (e) {};
        }
        sn.attachForm();
    };
    window.__smartNav.restoreFocus = function()
    {
        if (window.__smartNav.inPost == true) return;
        var curAe = document.activeElement;
        var sAeId = window.__smartNav.ae;
        if (sAeId==null || curAe!=null && 
(curAe.id==sAeId||curAe.name==sAeId))
            return;
        var ae = document.all(sAeId);
        if (ae == null) return;
        try { ae.focus(); } catch(e){};
    }
    window.__smartNav.saveHistory = function()
    {
        if (window.__smartNav.hif != null)
            window.__smartNav.hif.removeNode();
        if (    window.__smartNav.sHif != null
            &&  document.all[window.__smartNav.siHif] != null)
            document.all[window.__smartNav.siHif].insertAdjacentElement(
                        "BeforeBegin", window.__smartNav.sHif);
    }
    window.__smartNav.stopHif = function()
    {
        document.detachEvent("onstop", window.__smartNav.stopHif);
        var sn = window.__smartNav;
        if (sn.hifDoc == null && sn.hif != null)
        {
            try {sn.hifDoc = sn.hif.contentWindow.document;}
            catch(e){sn.hifDoc=null}
        }
        if (sn.hifDoc != null)
        {
            try {sn.hifDoc.execCommand("stop");} catch (e){}
        }
    }
    window.__smartNav.init =  function()
    {
        var sn = window.__smartNav;
        document.detachEvent("onstop", sn.stopHif);
        document.attachEvent("onstop", sn.stopHif);
        try { if (window.event.returnValue == false) return; } catch(e) {}
        sn.inPost = true;
        if (document.activeElement != null)
        {
            var ae = 
document.activeElement.id
;
            if (ae.length == 0)
                ae = 
document.activeElement.name
;
 
sn.ae
 = ae;
        }
        else
 
sn.ae
 = null;
        try {document.selection.empty();} catch (e) {}
        if (sn.hif == null)
        {
            sn.hif = document.all("__hifSmartNav");
            sn.hifDoc = sn.hif.contentWindow.document;
        }
        if (sn.hifDoc != null)
            try {sn.hifDoc.designMode = "On";}catch(e){};
        if (sn.hif.parentElement == null)
            document.body.appendChild(sn.hif);
        var hif = sn.hif;
        hif.detachEvent("onload", sn.update);
        hif.attachEvent("onload", sn.update);
        window.__smartNav.fInit = true;
    };
    window.__smartNav.submit = function()
    {
        window.__smartNav.fInit = false;
        try { window.__smartNav.init(); } catch(e) {}
        if (window.__smartNav.fInit)
            window.__smartNav.form._submit();
    };
    window.__smartNav.attachForm = function()
    {
        var cf = document.forms;
        for (var i=0; i<cf.length; i++)
        {
            if (cf[i].__smartNavEnabled != null)
            {
                window.__smartNav.form = cf[i];
                break;
            }
        }
        var snfm = window.__smartNav.form;
        if (snfm == null) return false;
        var sft = snfm.target;
        if (sft.length != 0 && sft.indexOf("__hifSmartNav") != 0) return 
false;
        var sfc = snfm.action.split("?")[0];
        var url = window.location.href.split("?")[0];
        if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + 
sfc.length != url.length) return false;
        if (snfm.__formAttached == true) return true;
        snfm.__formAttached = true;
        snfm.attachEvent("onsubmit", window.__smartNav.init);
        snfm._submit = snfm.submit;
        snfm.submit = window.__smartNav.submit;
        snfm.target = window.__smartNav.hifName;
        return true;
    };
    window.__smartNav.hifName = "__hifSmartNav" + (new Date()).getTime();
    window.__smartNav.ie5 = navigator.appVersion.indexOf("MSIE 5") > 0;
    var rc = window.__smartNav.attachForm();
    var hif = document.all("__hifSmartNav");
    if (snSrc == null) {
        snSrc = hif.src;
    }
    if (rc)
    {
        var fsn = frames["__hifSmartNav"];
 
fsn.name
 = window.__smartNav.hifName;
        window.__smartNav.siHif = hif.sourceIndex;
        try {
            if (fsn.document.location != snSrc)
            {
                fsn.document.designMode = "On";
                hif.attachEvent("onload",window.__smartNav.update);
                window.__smartNav.hif = hif;
            }
        }
        catch (e) { window.__smartNav.hif = hif; }
        window.attachEvent("onbeforeunload", window.__smartNav.saveHistory);
    }
    else
        window.__smartNav = null;
}
------------------------------------------------------------------------------------------------
Questo il codice che lo richiama:
------------------------------------------------------------------------------------------------
<IFRAME ID=__hifSmartNav NAME=__hifSmartNav STYLE=display:none 
src="/aspnet_client/system_web
/1_1_4322/SmartNav.htm"></IFRAME>
<form name="frmMain" method="post" action="index.html" language="javascript" 
__smartNavEnabled="true">
------------------------------------------------------------------------------------------------
Hai idea di come funzioni?
Se non hai tempo non c'è problema,
non voglio approfittare.
Grazie!!
Matteo Migliore.

 Hai idea di come funzioni?
A naso, parrebbe che utilizzi l'iframe nascosto per caricare il codice HTML
che gli serve, e aggiungerlo al documento corrente.
Ovviamente, così facendo non sta ricarcando alcunché, è quindi normale che
l'evento onload non venga scatenato.
Il mio spassionato consiglio è: butta nel cestino questa "SmartNavigation".
A prescindere che personalmente tendo ad evitare quegli ambienti che si
prendono il diritto di scrivere il codice al posto del programmatore; il
codice generato dalla "SmartNavigation" fa proprio schifo.
Se è per un'applicazione intranet, "passi".. (per modo di dire), ma se si
tratta di un sito web non puoi assolutamente utilizzare un codice del
genere. 
-- 
ZER0
~ The Tangent Universe collapsed 5995 days, 11 hours, 25 minutes and 43 seconds ago.
on air ~ "See Saw - Edge"

 genere.
Ancora davvero grazie
per l'aiuto e il tuo tempo.
Matteo Migliore.

 per l'aiuto e il tuo tempo.
Prego, figurati.
-- 
ZER0
~ The Tangent Universe collapsed 5996 days, 3 hours, 18 minutes and 6 seconds ago.

 Giusto per fare il doppio del lavoro,eh? :)
:-)
Io non li uso i suoi "bellissimi" script; avevo pensato ai tempi di
modificarli, ma poi mi sono detto: "e se questi mi installano una qualunque
delle loro patch, che vanno al ritmo di 1 alla settimana, e mi
sovrascrivono le mie modifiche?" Troppo sbatto...E come questo ce ne sono
tanti altri (vedasi p.e. i validators, una cosa orrenda. Sai come hanno
risolto? Sei IE? bon! Non sei IE? Ti disabilito l'intero script!!)
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

 risolto? Sei IE? bon! Non sei IE? Ti disabilito l'intero script!!)
Si, conoscono benissimo la "discriminazione razziale" attuata da .NET..
-- 
ZER0
~ The Tangent Universe collapsed 5996 days, 5 hours, 3 minutes and 39 seconds ago.