IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Chargement conditionnel par résolution


Sujet :

JavaScript

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut Chargement conditionnel par résolution
    Bonjour à tous.

    Travaillant sur un version Responsive je souhaiterais charger conditionnellement en fonction de la résolution.

    Connaissez vous une technique qui permettrais de télécharger ou non en fonction de la résolution les script Fb, G+?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	<script>
    (function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) return;
      js = d.createElement(s); js.id = id;
      js.async=true; js.src = "//connect.facebook.net/fr_FR/all.js#xfbml=1";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));</script>
    <script type="text/javascript">
      (function() {
        var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
        po.src = 'https://apis.google.com/js/plusone.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
      })();
    </script>
    Merci

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    À vue de nez, je ne crois pas qu'il y ait quelque chose à faire de plus compliqué que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (window.innerWidth < 400) {
       ...
    } else if (window.innerWidth < 600) {
       ...
    } else ...
    Tu vois l'idée ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <script>
    if(window.innerWidth > 400){ // <-- met la valeur que tu veux ici
     
    (function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) return;
      js = d.createElement(s); js.id = id;
      js.async=true; js.src = "//connect.facebook.net/fr_FR/all.js#xfbml=1";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));</script>
      (function() {
        var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
        po.src = 'https://apis.google.com/js/plusone.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
      })();
     
    }
    </script>
    Attention toutefois, ce chargement adaptatif n'est valable qu'au chargement de la page. S'il faut réagir au redimensionnement de la fenêtre après chargement, c'est un poil plus compliqué.
    One Web to rule them all

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut Merci
    Super merci bien,

    Effectivement cela ne prendra pas en compte le redimensionnement de la fenetre mais ca me va parfaitement.

    Cependant entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( window.width < 800 || screen.width < 800 ) {
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(window.innerWidth > 400){
    quel est la dirrérence?

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 048
    Points : 44 562
    Points
    44 562
    Par défaut
    Bonjour,
    - window.width : c'est la fenêtre d'affichage que l'on peut redimensionner
    - screen.width : là il s'agit de l'écran, sauf à le changer difficile de le redimensionner.

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut Merci encore
    Donc dans l'objectif d'éviter de charger que les connexions "lente ne télecharge".
    Donc en se disant que ca concerne les mobiles 3g, il est plus interessant de prendre le screen.with.

    1. Il n'est pas possible de détecter le type de connexion?


    Et pour le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
    dois je faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript">
    if(screen.Width > 768){ 
    (function(d){
    	  var f = d.getElementsByTagName('SCRIPT')[0], p = d.createElement('SCRIPT');
    	  p.type = 'text/javascript';
    	  p.async = true;
    	  p.src = 'http://platform.twitter.com/widgets.js';
    	  f.parentNode.insertBefore(p, f);
    	}(document));
    }
    </script>
    Merci

  7. #7
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Il y a bien la Network Information API en cours de spécification qui donne la bande-passante disponible, mais le support est quasi-nul.

    Éventuellement, ce que tu peux faire est de charger les modules sociaux une fois que toute la page est chargée. Tu peux ainsi mesurer le temps qu'a mis la page à se charger, et selon le temps que ça a pris choisir si tu veux charger les modules sociaux.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <head>
    ...
    <script>
    var initialLoadDate = Date.now();
    window.addEventListener("load",function(){
        var initialLoadTime = Date.now() - initialLoadDate;
        if(initialLoadTime < 5000){ //si la page s'est chargée en moins de 5 secondes
             //charger ici les modules sociaux
        }
    });
    </script>
    </head>
    One Web to rule them all

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut Merci encore3
    Merci c'est une solution interessante.

    Et pour le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
    dois je faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <script type="text/javascript">
    if(screen.Width > 768){ 
    (function(d){
    	  var f = d.getElementsByTagName('SCRIPT')[0], p = d.createElement('SCRIPT');
    	  p.type = 'text/javascript';
    	  p.async = true;
    	  p.src = 'http://platform.twitter.com/widgets.js';
    	  f.parentNode.insertBefore(p, f);
    	}(document));
    }
    </script>

  9. #9
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Le principe est le même pour Facebook, Google+ ou Twitter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function loadScript(src, callback) {
      var script = document.createElement('script');
      script.src = src;
      if (callback && callback.call) {
        script.addEventListener('load', callback);
      }
      document.getElementsByTagName('head')[0].appendChild(script);
    }
     
    loadScript("monfichier.js", function(){ 
    	console.log("monfichier.js chargé et exécuté");
    });

    Mais je te recommande d'utiliser window.innerWidth plutôt. Attention aussi aux majuscules, le JavaScript est sensible à la casse.
    One Web to rule them all

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut top
    Merci beaucoup.

    Juste une question.

    Pourquoi préférer :
    window.innerWidth à screen.Width ??

    Sachant que finalement ce qui m'interesse le plus est la taille de l'écran plus que la fenetre.
    Puisque si un desktop, connecté en ADSL, ouvre un fenetre en mini, cela ne me dérange pas qui charge les script.

  11. #11
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Simplement parce que l'objet screen ne fait partie d'aucun standard tel que défini par le W3C. De ce fait, on ne peut pas garantir que son implémentation soit générale et surtout homogène. Par exemple, sur IE cette valeur change selon le niveau de zoom de la page.

    En pratique, seul l'espace disponible pour l'affichage, c'est à dire dans window, est une donnée utile pour le développeur. Dans ton cas, c'est un raccourci que tu fais pour évaluer la bande-passante. Il peut s'avérer faux, entre les super-mobiles 4G++ et les PC de la France profonde en connexion satellite.
    One Web to rule them all

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut c'est clair
    Un grand merci sont très clair.

    Ok pour le screen vs window.

    Concernant le deuxième point:
    4g++ vs internet fixe profonde.

    Du coup tu choisirais la solution donné ici:

    Avec l'histoire du loadtime?
    mais du coup je suis obligé de passer mers script dans le header?

  13. #13
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Oui, si l'idée est de ne charger que pour les connexions rapides, alors il faut tester la vitesse de connexion.

    Tu n'es pas obligé de mettre tous tes scripts dans le <head>, l'important est d'avoir le script qui enregistre le premier "temps" le plus tôt possible, et l'évènement qui enregistre le second "temps" le plus tard possible. Plus il y a de délai et de requêtes entre le début et la fin de la mesure, plus la mesure sera précise et les fluctuations du réseau seront compensées par la moyenne. Enfin, il ne faut pas se leurrer, ça ne sera jamais ultra-précis.

    Puisque le code HTML est chargé et interprété de haut en bas, le script que je t'ai indiqué est à mettre dans <head>. Pour les autres tu fais comme tu veux du moment d'avoir un temps de mesure significatif. L'évènement window.onload lui sera déclenché lorsque tous les éléments de la page seront chargés.
    One Web to rule them all

Discussions similaires

  1. mise en forme conditionnelle par Date
    Par bibi28 dans le forum IHM
    Réponses: 10
    Dernier message: 24/08/2008, 16h17
  2. Formatage conditionnel par programmation
    Par zoolookxpn dans le forum IHM
    Réponses: 4
    Dernier message: 02/05/2007, 19h05
  3. [HTML] Chargement conditionnel page html
    Par jacques13 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/01/2007, 08h06
  4. recopie conditionnel par fonction VBA sous Excel
    Par LinusVince dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/02/2006, 18h33
  5. Réponses: 4
    Dernier message: 08/06/2004, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo