Wednesday, April 8, 2015

SharePoint - Errore javascript nel file WebResource.axd

Non so dire perché, né spiegarlo o trovare traccia del motivo per cui si presenta, ma ogni tanto, non su tutti i browser, non a tutti gli utenti, e neppure allo stesso utente nella stessa sessione di navigazione, però in pagine particolarmente personalizzate lato client (tramite jquery e javascript di varia forma), viene fuori un errore javascript

'Event' is undefined

normalmente in una delle righe del file WebResource.axd.
In alcune circostanze, non è neppure bloccante, in altre invece blocca l'esecuzione di altri javascript (soprattutto per browser datati, ad es IE7-8)

Proviamo a risolvere o aggirare il problema.

Eseguendo il debug di IE l'errore non si presenta.
Il che dà conferma alla teoria che l'osservazione modifica lo stato (fisica in background), ma non ci aiuta.

Entrando però in debug al momento dell'errore, ecco che abbiamo un'eccezione in questa funzione, dentro il WebResource.axd (riga 184 circa):

function Menu_HideItems(items) {
    if (document.body.__oldOnClick) {
        document.body.onclick = document.body.__oldOnClick;
        document.body.__oldOnClick = null;
    }
    Menu_ClearInterval();
   
if (!items || ((typeof(items.tagName) == "undefined") && (items instanceof Event))) {        items = __rootMenuItem;
    }

...


Mi sono fermato dal capirne i motivi: la funzione viene chiamata dall'evento document.body.onclick, il che fa pensare che sia per chiudere eventuali menu aperti, tramite il click, o roba del genere.
Va bene.
Nella mia pagina, serve un evento del genere? Se la risposta è NO, allora aggiriamo con questo codice, che ho messo nel $(document).ready.

//to prevent error on webresource.axd
var oldMenu_HideItems = Menu_HideItems;  
if(oldMenu_HideItems)
{
    Menu_HideItems = function(items)
    {
        try
          {
            return oldMenu_HideItems(items);
          }
        catch(err)
          {

          }
    }
}
//


Di fatto, ridefinisce la funzione, per recuperarla quando viene chiamata e poterla inserire in un try/catch.
Se la funzione non ha eccezioni, va, altrimenti, non fa nulla e non ho più errori javascript nella mia pagina.

E via.