Come si può disabilitare un modulo in base alla dimensione del dispositivo o della finestra in Joomla 3 per ottimizzare le prestazioni dei dispositivi mobili?


14

Sono un sostenitore di Responsive Web Design in collaborazione con Adaptive Web Design (ovvero - un design che regola la visualizzazione per tutti i dispositivi e fornisce contenuti in base alle dimensioni della porta di visualizzazione) rispetto a progetti di siti "mobili" separati.

Ci sono alcuni svantaggi, ad esempio, su schermi di grandi dimensioni che vorrei includere alcuni moduli che verranno nascosti per dimensioni di finestre più piccole. Tuttavia, nel caso in cui un modulo sia nascosto in base alla dimensione della finestra, il caricamento e l'esecuzione di quel modulo causano un inutile impatto sulle prestazioni quando è noto che il modulo specifico non verrà mai visualizzato con una dimensione della finestra più piccola.

Come posso utilizzare le dimensioni della finestra per disabilitare efficacemente un modulo (ovvero impedirne l'esecuzione) al fine di accelerare le prestazioni?

Risposte:


15

Advanced Module Manager ( http://www.nonumber.nl/extensions/advancedmodulemanager ) consente di assegnare moduli in base al tipo di browser. Quindi è possibile selezionare dispositivi mobili, desktop o specifici. Tuttavia, non ti consente di scegliere in base alle dimensioni, quindi è utile solo fino a un certo punto.

Potrebbe anche essere possibile con una combinazione di php e javascript. Manderò questa domanda al mio amico, potrebbe avere un'idea.


Che bella idea, non ho mai pensato di usare AMM in questo modo.
jackJoe,

Peter ha messo moltissime fantastiche funzionalità in AMM, secondo me è un must.
Faye,

Sono d'accordo con questo. Se fossi bloccato con un tema che non aveva questo incorporato (ad esempio, i temi di curvatura 7 hanno questo incorporato) allora userei AMM.
Brian Peat,

@BrianPeat: puoi fornire ulteriori dettagli su come funziona con WARP7?
NivF007,

3
Warp 7 ha un pannello nell'amministratore del modello che ti consente di fare clic sui pulsanti per desktop / tablet / telefono e attiva e disattiva i moduli in base a tali impostazioni. Il tema del razzo fa qualcosa di simile con lezioni speciali. Quello che non so è se i moduli sono scaricati, o se tutto è caricato e quindi semplicemente nascosto. Ho il sospetto che sia quest'ultimo poiché puoi vederlo cambiare mentre ridimensioni il browser. Se scarichi completamente le cose in base alle dimensioni, cosa farà se ridimensioni attivamente la finestra?
Brian Peat,

10

Non penso che dovresti disabilitare moduli del genere e chiamarlo comunque responsive design. Parte del punto con reattivo è che risponderà ai cambiamenti di viewport e non solo che stampa un layout diverso per schermi di dimensioni diverse.

A seconda delle dimensioni dello schermo di esempio, è possibile che un tablet in modalità verticale non carichi il modulo ma che lo stesso tablet potrebbe aver bisogno di quel contenuto una volta in modalità orizzontale.


3
Anche se questo è vero, non è davvero efficace nella pratica. Ciò significa che un utente iPhone non avrà mai una risoluzione dello schermo di 1440x900, né avrà nemmeno la possibilità di ridimensionare la visualizzazione. Il responsive design in cui le persone sono tipo "guarda come cambiano le cose quando ridimensiono la finestra del mio browser" è efficace solo per i designer che vogliono mettersi in mostra. In pratica, è perfettamente corretto adottare l'approccio di spegnimento dei moduli e modifica dell'output per schermi di dimensioni diverse.
Don Gilbert,

3
@Don Mi dispiace che non sia semplicemente un design reattivo allora, e ci sono molte persone sul desktop che sfruttano le funzionalità di ridimensionamento quando lavorano in Windows. Il design reattivo risponde alle modifiche del viewport non indipendentemente dal fatto che provenga da un determinato dispositivo o meno.
Spunkie,

2
Sono d'accordo. Ma non sono d'accordo con gli obiettivi del "responsive design". Come ho detto, è stato inventato dai designer per mettersi in mostra. Dimenticano il fatto che l'iPhone non avrà mai una risoluzione enorme. tl; dr - Il design reattivo non ha importanza sui dispositivi mobili. Preferirei risparmiare larghezza di banda di rete piuttosto che "design reattivo puro".
Don Gilbert,

2
@DonGilbert e Spunkie - IMO - entrambi avete ragione. La definizione "rigorosa" di Responsive Web Design non include la modifica di "contenuto"
Modificherò

8

Questa è una classe JS che ho creato qualche tempo fa che potrebbe utilizzare JavaScript per rilevare i viewport, non è mai stata sottoposta a test rigorosi ma funziona.

function ResJS(){
    this.min = 0;
    this.max = 0;
    this.config = config;
    this.width = function(){
        return jQuery(window).width();
    }
    this.breakpoint = function(min,max){
        this.min = min;
        this.max = max;
        this.outside = false;
        this.inside = false;
        this.triggeredOut = false;
        this.triggeredIn = false;
        this.enter = function(callback){
            var context = this;
            jQuery(window).on('resize',function(){
                if(context.min<context.width()&&context.max>context.width()){
                    if(!context.triggeredIn){
                        jQuery(document).ready(function(){callback(context.min,context.max)});
                        context.inside = true; //browser width has entered breakpoint
                        context.outside = false; //browser has left another breakpoint
                        context.triggeredIn = true; //triggered event for breakpoint
                        context.triggeredOut = false; //be ready to trigger leave event
                    }
                }else{
                    context.inside = false; //browser width is not within breakpoint
                    context.outside = true; //brower width is outside of breakpoint
                }
            });
            if(context.min<context.width()&&context.max>context.width()){
                jQuery(document).ready(function(){callback(context.min,context.max)});
                context.inside = true;
                context.outside = false;
                context.triggeredIn = true;
                context.triggeredOut = false;
            }else{
                context.inside = false;
                context.outside = true;
                context.triggeredOut = true;
                context.triggeredIn = false;
            }
            return this;
        }
        this.leave = function(callback){
            var context = this;
            jQuery(window).on('resize',function(){
                if(context.outside&&!context.triggeredOut){
                    jQuery(document).ready(function(){callback(context.min,context.max)});
                    context.triggeredIn = false;
                    context.triggeredOut = true;
                }
            });     
            return this;
        }
        return this;
    }
    return this;
}

Fondamentalmente lo usi in questo modo

ResJS()
    .breakpoint(0,600)
    .enter(function(min,max){
        console.log(min,max,'enter');
    })
    .leave(function(min,max){
        console.log(min,max,'leave');
    });

Breakpoint ha parametri min / max per larghezza, quindi una funzione concatenata per immetterlo e uscire, con un callback per eseguire un codice JS.

Non posso andare in dettaglio su come funziona, come ho fatto tanto tempo fa, ma sei libero di usarlo se sarà di aiuto. Questo può essere usato per caricare i moduli tramite Ajax in base alla finestra. Credo che com_ajax di joomla possa essere usato con questo per creare alcune funzioni davvero interessanti.


1
Sembra un pezzo importante del puzzle e ha interessanti possibilità: grazie per la risposta e soprattutto per la pubblicazione del codice.
NivF007,

1
La risposta migliore è il mio collega, questa è più o meno la mia idea: P
Jordan Ramstad


3

Se si desidera accelerare le prestazioni, non caricare moduli non necessari. Se non è necessario su schermi piccoli, non è necessario nemmeno su schermi più grandi.

Le persone con display di dispositivi più grandi vogliono anche un sito Web veloce che non carichi inutili trapianti. Stai assumendo erroneamente che schermi più grandi hanno più larghezza di banda disponibile. Non lo fanno.

Sii un buon designer e offri a tutti i tuoi utenti un'esperienza del sito ottimizzata, indipendentemente dalle dimensioni dello schermo.


2

Vorrei suggerire che lo sniffing del browser è il modo sbagliato di andare qui. Se vuoi davvero caricare solo i moduli in base alla larghezza dello schermo, devi eseguire javascript, che quindi chiama il modulo da AJAX (com_ajax). Tieni presente che potrebbe esserci un profitto in termini di ottimizzazione dei motori di ricerca per i contenuti caricati da AJAX.


2

In genere uso css @media per farlo accadere. Rende semplice nascondere le cose in base alle dimensioni dello schermo e farle analizzare per le volte in cui una tavoletta orizzontale è abbastanza ampia da mostrarla e la larghezza del ritratto non lo è. Ecco un esempio:

@media (max-width:699px) {
    #moduleid, .modulewrapperclass {display:none}
}

Di solito lo uso per nascondere un'intera posizione del modulo, quindi baso il mio selettore CSS sull'involucro di quella posizione (o posizioni in alcuni modelli).


Grazie per la tua risposta. Il problema con l'approccio CSS media query è che stai ancora eseguendo un modulo (anche se stai scegliendo di non visualizzarlo). La soluzione che sto cercando non eseguirà il modulo a meno che non venga visualizzato.
NivF007,

Come altri hanno già detto, questa potrebbe non essere la migliore idea per le persone che cambiano le dimensioni del viewport dopo il caricamento della pagina e le tavolette orizzontali rispetto ai ritratti. I pochi centesimi di secondo che il server impiega per analizzare questo modulo non importeranno molto e dal momento che è visualizzato: nessuno sui dispositivi più piccoli non lo rende, quindi non si perde tempo. - Ma se vuoi davvero non caricarlo, allora Advanced Module Manager è probabilmente la strada da percorrere come collegata in un'altra risposta.
pathfinder,

1

È possibile caricarlo su richiesta utilizzando alcuni javascript che chiama com_ajax e restituisce solo i moduli per la dimensione corrente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.