Questo sito utilizza i cookie per personalizzare i contenuti e gli annunci (Google AdSense), fornire le funzioni dei social media (condivisione degli articoli) e analizzare il traffico (Google Analytics). Inoltre fornisce informazioni sul modo in cui utilizzi il sito alle agenzie pubblicitarie, agli istituti che eseguono analisi dei dati web e ai social media miei partner (Google). Il proseguimento nella navigazione implica un tacito assenso all'utilizzo dei cookies. Se non sei d'accordo sull'utilizzo, ti invito ad allontanarti da questo sitoVisualizza i dettagli.

Venerdì 9 Dicembre 2016

Valutazione attuale: 0 / 5

Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 

In un sito Joomla 1.5.2 su cui sto lavorando è impossibile accedere con Internet Explorer alla homepage dopo il login. Il browser restituisce l'errore "Impossibile aprire il sito. Operazione terminata" e chiude la connessione.
Il problema sembra essere un baco che IE si porta dietro dalla versione 5.5 e che il buon Roberto Cancelli della PiccoloMoscio non si è mai preoccupato di risolvere.Purtroppo in alcune particolari condizioni il codice di Joomla incappa in questo bug e rende impossibile la navigazione all'interno del sito.

Vediamo insieme come risolvere.

 

Il problema consiste in una anomalia della gestione delle chiamate DOM, in pratica IE non si preoccupa minimamente di controllare le chiamate DOMReady, quindi tali chiamate vengono eseguite istantaneamente.
In pratica se dobbiamo lanciare uno script il prima possibile, senza attendere il caricamento completo di tutti gli oggetti della pagina dovremmo sostituire la chiamata window.onload() con window.addEvent(’domready’).
In questo modo potremmo, ad esempio, lanciare un menù java senza attendere il completo caricamento di tutte le immagini in una homepage, cosa molto utile specie se si usa una connessione non proprio velocissima.

Joomla in questo modo carica Mootools, un framework javascript per abilitare gli effetti Web 2.0.

Come dicevo prima IE non ha un controllo delle chiamate DOM, quindi se si cerca di eseguire una chiamata che modifica un tag prima che esso sia chiuso, IE se la prende male e e non ci parla più, impedendoci di vedere il sito che desideriamo navigare.

Sull'articolo KB927917 Microsoft spiega la causa di questo problema con uno scioglilingua:

Questo problema si verifica perché un elemento contenitore di figlio HTML contiene il codice di script che si tenta che modifica l'elemento contenitore di padre dei figli contenitori. Si tenta il codice di script che modifica l'elemento contenitore di padre utilizzando il metodo innerHTML o il metodo appendChild.

Comunque il consiglio che da è di non inserire codice JS che modifichi un tag fino a quando lo stesso tag non è stato chiuso.

Ok, chi spiega a Microsoft che se sto usando un CMS complesso come Joomla non posso riscrivermi centinaia di pagine di codice?
 

A questo punto dovremmo trovare una soluzione alternativa.

Purtroppo per chi usa IE l'unico modo per far funzionare un DOM è attendere il completo caricamento della pagina e di tutti i suoi oggetti.

Negli Headers della homepage di Joomla possiamo trovare, poco sopra la chiusura dell'headers stesso:


window.addEvent('domready', function(){ var JTooltips = new Tips($$('.hasTip'), { maxTitleChars: 50, fixed: false}); })

Dovremmo sostituire questa stringa con

var load_method = (window.ie ? 'load' : 'domready');
window.addEvent(load_method, function(){ var JTooltips = new Tips($$('.hasTip'), { maxTitleChars: 50, fixed: false}); });


Ovvero, controlla se il browser è IE, se si allora esegui il domready al caricamento della pagina.

Non è una cosa piacevole per quanti usano Internet Explorer, navigano su siti con molte immagini ed hanno una connessione lenta, ma che dire...
Forse è il caso di passare ad altri browser?

Bene, per modificare questa stringa html dobbiamo modificare la funzione che la genera.
Essa si trova nel file /libraries/joomla/html/html/behavoir.php, esattamente alla riga 108 di tale file incluso con la versione 1.5.2 di Joomla, troviamo:

$tooltipInit = ' window.addEvent(\'domready\', function(){ var JTooltips = new Tips($$(\''.$selector.'\'), '.$options.'); });';

Mettiamo un bel // davanti alla riga per commentarla e sostituiamola con
$tooltipInit = ' var load_method = (window.ie ? \'load\' : \'domready\');'
.'window.addEvent(load_method, function()'
.'{ var JTooltips = new Tips($$(\''.$selector.'\'), '.$options.'); });';

Salviamo, cancelliamo la cache di IE e ricarichiamo la homepage, eseguiamo il login e, come per magina, la pagina si apre senza problemi!

La vita è un continuo mettersi in discussione, trovare i propri limiti ed affrontarli, io ogni giorno ne trovo almeno 3 e tutti portano a prodotti Microsoft. Sono contento che esistono tutti questi bachi, altrimenti rischierei di perdere parecchia elasticità mentale!