2016-07-01 1 views
0

J'ai besoin d'aide pour simplifier mon code. J'essaie d'appliquer le D.R.Y. principe du mieux que je peux et j'ai des problèmes. Toute aide serait grandement appréciée.Vous rencontrez des difficultés pour appliquer D.R.Y. à mon jQuery

$('document').ready(function(){ 
    'use strict'; 

    var body = $('body'); 

    body.find('#button1').click(function(){ 
     body.find('#item1').add('#item2').fadeOut(); 
     body.find('#item3').fadeIn(); 
     body.find('#button1').removeClass('btn-info').addClass('btn-default'); 
     body.find('#button2').removeClass('btn-default').addClass('btn-info'); 
    }); 

    body.find('#button2').click(function(){ 
     body.find('#item3').fadeOut(); 
     body.find('#item1').add('#item2').fadeIn(); 
     body.find('#button2').removeClass('btn-info').addClass('btn-default'); 
     body.find('#button1').removeClass('btn-default').addClass('btn-info'); 
    }); 
}); 

Merci d'avance!

Répondre

0

En plus d'utiliser simplement $ pour accéder à des éléments qui sont uniques, vous aimerez peut-être aussi cela comme une amélioration pour la réutilisation et la lisibilité,

function makeInfo(id) { 
    $(id).removeClass('btn-default').addClass('btn-info'); 
} 
function makeDefault(id) { 
    $(id).removeClass('btn-info').addClass('btn-default'); 
} 

$('document').ready(function(){ 
    'use strict'; 

    $('#button1').click(function(){ 
     $('#item1').add('#item2').fadeOut(); 
     $('#item3').fadeIn(); 
     makeInfo('#button2'); 
     makeDefault(this);    
    }); 

    $('#button2').click(function(){ 
     $('#item3').fadeOut(); 
     $('#item1').add('#item2').fadeIn(); 
     makeInfo('#button1'); 
     makeDefault(this);    
    }); 
}); 
+0

Merci cela fonctionne pour moi. – sayhelloelijah

0

Il semble qu'un élément de DRY qui peut être appliqué est pour la partie de la classe:

//add event bound to the click of a element with class btn-default 
body.on('click', '.btn-default', function() { 
    //remove btn-default from this class and add btn-info 
    $(this).removeClass('btn-default').addClass('btn-info'); 
    //remove btn-info from this class and add btn-default 
    $('.btn-info').removeClass('btn-info').addClass('btn-default'); 
}); 

faisant tout le code:

$('document').ready(function(){ 
    'use strict'; 

    var body = $('body'); 

    //add event bound to the click of a element with class btn-default 
    body.on('click', '.btn-default', function() { 
     //remove btn-default from this class and add btn-info 
     $(this).removeClass('btn-default').addClass('btn-info'); 
     //remove btn-info from this class and add btn-default 
     $('.btn-info').removeClass('btn-info').addClass('btn-default'); 
    }); 

    body.find('#button1').click(function(){ 
     body.find('#item1').add('#item2').fadeOut(); 
     body.find('#item3').fadeIn(); 
    }); 

    body.find('#button2').click(function(){ 
     body.find('#item3').fadeOut(); 
     body.find('#item1').add('#item2').fadeIn(); 
    }); 
}); 
0

Il n'y a pas de répétition inutile, mais il est inutile code. Par exemple, pas besoin de commencer à $('body') et .find() les balises suivantes.

Au lieu de cela, suivez ce modèle:

(1) enlever var body = $('body'); - pas besoin pour elle

(2) Effectuez ces modifications:

body.find('#button1').click(-- can be -- $('#button1').click(

body.find('#item1').add('#item2').fadeOut(); == $('#item1').add('#item2').fadeOut(); 

body.find('#item3').fadeIn(); == $('#item3').fadeIn(); 

etc.


Mise à jour: Pour réduire les recherches DOM, mettez en cache l'ensemble du sélecteur:

$('document').ready(function(){ 
    'use strict'; 
    var $i1 = $('#item1'); 
    var $i3 = $('#item3') 
    var $b1 = $('#button1'); 
    var $b2 = $('#button2'); 

    $b1.click(function(){ 
     $i1.add('#item2').fadeOut(); 
     $i3.fadeIn(); 
     $b1.removeClass('btn-info').addClass('btn-default'); 
     $b2.removeClass('btn-default').addClass('btn-info'); 
    }); 

    $b2.click(function(){ 
     $i3.fadeOut(); 
     $i1.add('#item2').fadeIn(); 
     $b2.removeClass('btn-info').addClass('btn-default'); 
     $b1.removeClass('btn-default').addClass('btn-info'); 
    }); 
}); 
+0

Merci, la raison pour laquelle j'ai eu le corps $ et .Find était de porter le nombre de fois que je recherche les DOM à seulement une fois. Pas vraiment pour la performance de ce code spécifiquement, mais pour en faire une pratique pour le futur, beaucoup plus grand, le projet – sayhelloelijah

+0

Juste cela ne réduira pas la recherche du DOM - le '.find()' recherche le DOM. Pour réduire la recherche dans le DOM, voir les modifications à ma réponse – gibberish

+0

Merci, grâce à certaines ressources que j'ai trouvées, il a déclaré que le fait d'appeler le sélecteur une fois mettrait en cache tout ce qui s'y trouve, et '' '.find()' '' chercherait à travers cette sélection. – sayhelloelijah

0

Vous pouvez créer une fonction unique (dire « toggleElements ») qui prend un drapeau et effectue toutes les actions nécessaires en fonction de la valeur du drapeau, puis le faire:

body.find('#button1').click(function() { 
    toggleElements(true); 
}); 
0

Je ne peux pas voir les problèmes dans votre code, et les changements ne permettront pas d'améliorer la lisibilité. Il n'est pas toujours "faire ce que vous pouvez, mais ne répétez pas une seule ligne de code" - vous avez besoin de trouver le meilleur, et votre apparence est bonne.

Cependant, il y a des améliorations possibles:

  1. Pourquoi utilisez-vous le corps si vos identifiants d'éléments sont uniques? Vous pouvez simplement utiliser le sélecteur. Vous pouvez combiner le sélecteur au lieu de .add.

Quelque chose comme:

$('document').ready(function(){ 
    'use strict'; 

    $('#button1').click(function(){ 
     $('#item1, #item2').fadeOut(); 
     $('#item3').fadeIn(); 
     $('#button1').removeClass('btn-info').addClass('btn-default'); 
     $('#button2').removeClass('btn-default').addClass('btn-info'); 
    }); 

    $('#button2').click(function(){ 
     $('#item3').fadeOut(); 
     $('#item1,#item2').fadeIn(); 
     $('#button2').removeClass('btn-info').addClass('btn-default'); 
     $('#button1').removeClass('btn-default').addClass('btn-info'); 
    }); 
}); 

Une autre option sont de combiner cette fonctionnalité dans une fonction avec l'argument booléen ou utiliser des classes CSS et transitions. Comme je l'ai dit, à mon avis, 4 lignes de code sont OK pour ne pas être "optimisé". Si vos fonctions grandissent, optimisez-les.

+0

Merci, j'utilisais le sélecteur de corps et trouvais pour amener les fois où j'ai cherché le DOM une fois dans le script. Ce n'est pas vraiment pour la performance de ce script, mais c'est une pratique de rechercher le DOM aussi peu de fois que possible. La plupart du temps c'est moi essayant de faire la pratique du code propre, j'attends des projets beaucoup plus grands dans le futur. – sayhelloelijah

0

Vous pouvez essayer quelque chose comme ça, où vous définir quels éléments sont pour être affiché en utilisant un attribut data sur chaque bouton. Cela a l'avantage de nécessiter moins de travail lorsque vous avez besoin d'ajouter plus de boutons ou d'éléments, et fonctionne pour n'importe quelle combinaison de boutons/éléments.

jsFiddle

HTML:

<input type="button" id="button1" class="btn-info" value="Button 1" data-show="#item1" /> 
<input type="button" id="button2" class="btn-default" value="Button 2" data-show="#item2" /> 
<input type="button" id="button3" class="btn-default" value="Button 3" data-show="#item2, #item3" /> 

<div id="item1" class="itemClass">Item 1</div> 
<div id="item2" class="itemClass">Item 2</div> 
<div id="item3" class="itemClass">Item 3</div> 

JS:

$('body').on('click', '.btn-default', function() { 
    var show = $(this).data('show'); 
    $('.itemClass').not(show).fadeOut(); 
    $(show).fadeIn(); 

    $('.btn-info').addClass('btn-default').removeClass('btn-info'); 
    $(this).addClass('btn-info').removeClass('btn-default'); 
}); 
+0

Merci pour votre commentaire. Je vais certainement utiliser cela dans le futur – sayhelloelijah