2009-10-23 6 views
0

Fondamentalement, j'essayais de reproduire l'une des choses que xajax m'a donné avec Jquery -> La possibilité de définir ce que ma réponse modifie côté serveur sans rien mettre en place côté client. Fonctionne parfaitement tel quel, mais chaque fois que je veux appeler une fonction Jquery différente, je dois l'ajouter à mes instructions if.Simplifier ma fonction Jquery xajax

Chaque élément du tableau de réponse contient quelque chose à modifier côté client.

Je devrais être en mesure de retirer la quasi-totalité de la this.action == 'blah' si les déclarations et remplacer avec un javascript malin, mais apparemment, je ne suis pas assez intelligent. :)

$ .showMessage est simplement mon remplacement pour l'alerte, avec un délai d'attente et un peu collant.

Mon client fonction Jquery:

$.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; 
}; 

Mon 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); 

Répondre

2

Cela devrait fonctionner:

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

'if (this.action == 'eval') {eval (this.content); } else {$ (this.target) [this.action] (this.content); } –

+0

J'ai essayé toutes sortes de variations sur ce que vous venez de proposer. Je vous ferai savoir si cela fonctionne ... –

+0

Yep. La version de Justin fonctionne, mais puisqu'il s'agissait d'un commentaire, vous obtenez le vote. Je vous remercie. –

0

Je ne suis pas sûr de ce que vous demandez ? Stylistiquement, je l'écrire 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 d'exécuter ce que le serveur renvoie, qui envoie non seulement toujours revenir une action eval?

+0

s'échappant principalement. –

Questions connexes