Question

En fait, j’essayais de reproduire l’une des choses que xajax m’avait données avec Jquery - > La possibilité de définir ce que ma réponse modifie côté serveur sans rien configurer du côté client. Fonctionne parfaitement tel quel, mais chaque fois que je souhaite appeler une fonction Jquery différente, je dois l’ajouter à mes instructions if.

Chaque élément du tableau de réponses contient un élément à modifier côté client.

Je devrais être en mesure de supprimer presque toutes les déclarations this.action == 'blah' if et de les remplacer par un javascript intelligent, mais apparemment, je ne suis pas assez intelligent. :)

$. showMessage est tout simplement mon remplaçant pour alert, avec un délai d'expiration et un message persistant.

Fonction Jquery de mon client:

$.doAjax = function(func,values) {
 $.ajax({ data: values, url: '/time/ajax/' + func, type: 'POST', dataType: 'json', timeout: 5000,
  error: function(xhr, ajaxOptions,thrownError){ $.showMessage('Error processing request: ' +  func,10000);$('#debug').html(xhr.responseText); },
  success: function(data){
    if(data){
  $.each(data, function(){
    if ( this.action == 'attr' ) $(this.target).attr(this.content);
    if ( this.action == 'removeAttr' ) $(this.target).removeAttr(this.content);
    if ( this.action == 'addClass' ) $(this.target).addClass(this.content);
    if ( this.action == 'removeClass' ) $(this.target).removeClass(this.content);
    if ( this.action == 'html' ) $(this.target).html(this.content);
    if ( this.action == 'text' ) $(this.target).text(this.content);
    if ( this.action == 'val' ) $(this.target).val(this.content);
    if ( this.action == 'eval' ) {
          try { 
        eval(this.content); 
      }
      catch(err) {
            $.showMessage(err,5000);
      };
    };
      });
    }
  } 
 });
 return this;
};

Code côté serveur:

header("Content-type: text/plain");   
$response = array();
$response[] = array('action'=>'html','target'=>'#booked_time_group_unbilled','content'=>get_booked_time_group_unbilled());
$response[] = array('action'=>'html','target'=>'#booked_time_my_unbilled','content'=>get_booked_time_my_unbilled());
$response[] = array('action'=>'eval','target'=>'','content'=>"$.showMessage('The selected time has been deleted',5000,true)");
echo json_encode($response);
Était-ce utile?

La solution

Cela devrait fonctionner:

$(this.target)[this.action](this.content);

Autres conseils

Je ne sais pas exactement ce que vous demandez? Stylistiquement, je l’écrirais comme ceci:

var handlers = {
    attr: function() { $(this.target).attr(this.content) },
    removeAttr: function() { $(this.target).removeAttr(this.content) },
    // etc.
};

$.each(data,function() {
   handlers[this.action].call(this);
});

Si vous voulez juste exécuter tout ce que le serveur renvoie, lequel ne renverra pas toujours une action eval?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top