2011-04-19 6 views
1

J'utilise le code suivant pour deux liens: a.vote-down-0 et a.vote-up-0, ils font la même chose, sauf que chacun spécifie si le vote est en haut ou en bas .Refactoring Jquery: parsing json

$('a.vote-down-0').click(function() { 

    var id = $(this).siblings('.reply-id').val(); 
    var ajax_auth_token = $('#auth_token').val(); 
    var c_button = this; 


    $.post('user/?action=ajax', { 
     vote_type: 'down', 
     reply_id: id, 
     auth_token: ajax_auth_token 
    }, function(data, return_status) { //return status is just if ajax works or not 

     var json_data = jQuery.parseJSON(data); 

     switch(json_data.r_message) 
     { 
      case "success": 
       output = "Yay it works!"; // change 
       $(c_button).removeClass('vote-down-0').addClass('vote-down-1'); 
       $(c_button).siblings('a.vote-up-0').addClass('vote-up-1').removeClass('vote-up-0'); // ** TODO: this needs to be repeated for all cases below** 
      break; 

      case "no_vote": 
       output = "You've run out of negative votes."; 
      break; 

      case "vote_limit": 
       output = "You can vote anymore today. Limit is 25 per day."; 
      break; 

      case "login": 
       output= "You need to login before you can vote."; 
      break; 

      case "own": 
       output = "You cannot vote on your own comment."; 
       $(c_button).removeClass('vote-down-0').addClass('vote-down-1'); 

      break; 

      case "already": 
       output ="You have already voted on this."; 
      break; 

      case "session": 
       output = "Your login session has expired, please login again."; 
      break; 

    } 

alert(output); 

Ceci lit la réponse renvoyée via JSON et donne une alerte différente pour chaque cas.

Y at-il un moyen plus simple de le faire? Comment cela pourrait-il être ré-factorisé?

Répondre

1

Vous pouvez essayer de changer la classe de vos balises un de

<a class="vote-up-0"> 

à

<a class="vote-0 up"> 

alors vous pouvez factoriser les deux fonctions:

$('a.vote-0').click(function() { 
    var voteType = $(this).is('.up') ? 'up' : 'down'; 

    ... snip ... 

    $.post('user/?action=ajax', { 
     vote_type: voteType, 
     reply_id: id, 
     auth_token: ajax_auth_token 
    } 
    ... 

Le code pour case success puis devient simplement:

$(c_button).removeClass('vote-0').addClass('vote-1'); 
$(c_button).siblings('a.vote-0').addClass('vote-1').removeClass('vote-0');