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

jQuery Discussion :

Meilleur selecteur CSS pour ne pas faire ramer le navigateur avec mon traitement


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut Meilleur selecteur CSS pour ne pas faire ramer le navigateur avec mon traitement
    Je vous expose mon problème :

    J'ai une liste de de checkbox du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" value="valeur_0" class="checkbox_contact validate[required]" id="checkbox_contact_0" name="checkbox_contact" />
    Cette liste peut contenir jusqu'à plusieurs dizaine de checkbox. Mon but est de récupérer les checkbox qui ont été coéchées par l'utilisateur.

    A l'heure actuelle, j'utilise le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          $('input[name=checkbox_contact]:checked').each(function(){
            value += this.value + ';';
          });
    pour agréger dans une string toute mes "value" pour les checkbox sélectionnées.

    Ce code marche très bien pour un petit nombre de checkbox, mais à partir du moment ou ce nombre augment (plusieurs dizaines), cette fonction dure longtemps et dans certains cas sous IE, j'ai une popup m'indiquant qu'un script ralenti internet explorer et risquerait de le faire planter.

    J'ai cherché sur le net et pour moi, cette méthode est la meilleure pour effectuer mon traitement. Qu'en pensez vous ? Sinon pensez vous qu'il y a une méthode pour soulager le navigateur ?

    Merci d'avance

    Olivier

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Selon moi, le plus efficace (mais à tester) serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $('.checkbox_contact').each(function(){
        if(this.checked){
            value += this.value + ';';
        }
    });
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Merci pour ta réponse !
    Bon j'ai testé et .... c'est pas plus rapide. Je pense que ya pas possibilité de faire mieux. En passant par le selecteur "input" ca permet de faire un filtrage sur les élément a récupérer (getElementsByTagName) tandis qu'en passant pas la classe, il parcourt tous les éléments du dom et vérifie s'ils ont ou non la class.

    Tout ça pour dire que ça ma tout de même permis de me rendre compte que le problème ne venait pas de mon code mais de validationEngine qui bouffait énormément de ressources lors de la validation du formulaire. Du coup je vais faire la validation à la main, car ça passe mieux

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Non, pas tout à fait, il existe des méthodes plus appropriées que de parcourir l'ensemble du DOM

    Pour la classe, jQuery passe par getElementsByClassName, sinon, jQuery essaye d'utiliser querySelectorAll() et si rien n'est possible (navigateur non conforme ou syntaxe du sélecteur non valide), alors on passe par l'artillerie lourde.
    C'est pour cela que ma version devrait être plus efficace.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 212
    Par défaut
    Bonjour,
    la concaténation, en terme de vitesse n'est pas ce que l'on fait de mieux.
    Il vaut le coup d'essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $('.checkbox_contact').each(function(){
        if(this.checked){
            result[result.length] = this.value + ';';
        }
    });
    puis d'utiliser result.join('');.

    Il reste surprenant que pour quelques dizaines de checkbox il y ait une alerte écran.

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    methode intéressante de jquery : serializeArray()

    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
    19
    20
     
    <script type="text/javascript">
     
    $(function(){
    var i=-1;
     
    while(++i<100){
    $("body").append( $("<input/>").attr({"type":"checkbox","id":"checkbox_contact_"+i,"name":"checkbox_contact"} ).val("valeur_"+i) )
    }
    $("#foo").click(function(){
    	data=$('[name="checkbox_contact"]:checked').serializeArray()
    	console.log(data)
    	})
    })
    </script>
    </head>
    <body>
    <input type="button" value="go" id="foo" />
    </body>
    </html>
    Résultat dans la console:
    [Object { name="checkbox_contact", value="valeur_82"}, Object { name="checkbox_contact", value="valeur_83"}, Object { name="checkbox_contact", value="valeur_85"}]
    Et pour passer directement au string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $("#foo").click(function(){
    	DataString=new Array()
    	$.each( $('[name="checkbox_contact"]:checked').serializeArray(), function(elt, data){DataString.push(data.value) } )
     
    	alert(DataString.join(';'))
    	})
    })
    ou en se rapprochant plus de la solution de NoSmo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$.each( $('[name="checkbox_contact"]:checked'), function(index,elt){DataString+=$(elt).val()+";" } )
    	alert(DataString.replace(/;$/,''))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/02/2009, 10h10
  2. CSS pour ne pas griser les bouton radio en mode 'disabled'
    Par niko73 dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 16/01/2009, 10h05
  3. j'arrive pas à faire la mise à jour de mon antivirus
    Par silence_r dans le forum Sécurité
    Réponses: 6
    Dernier message: 06/09/2008, 10h47
  4. Selecteur CSS pour agir sur balise parent.
    Par TronsoT dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 01/08/2006, 16h47

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