2010-12-15 14 views
0

Avant d'exécuter un fichier json et de désactiver un bouton, je souhaite simplement activer d'autres boutons qui ont pu être désactivés auparavant. Je pense que c'est lié à des rappels que je ne comprends toujours pas. Dans le code ci-dessous, le bouton cliqué ne devient pas désactivé avant l'exécution de getJSON. Un callback est une fonction que vous transmettez à une autre fonction.jquery - rappels 101

$(".btnUseProduct").live("click", function(e) { 

    var clickedId = $(this).attr('id'); 
    var provisioning_id = clickedId.split("^")[0]; 
    var entity_id = clickedId.split("^")[1]; 
    var entity = clickedId.split("^")[2]; 

    showUseButtons(function(){   

       $(this).attr({'disabled':'disabled','value':'Used'}); //doesn't work 
       $.getJSON("/chinabuy-new/cfcs/services.cfc?method=update_provisioning&returnformat=json&queryformat=column",{"provisioning_id":provisioning_id,"entity_id":entity_id},function(res,code){       
       }); 
     }); 
    e.preventDefault(); 
}); 

function showUseButtons() { 
    $(".btnUseProduct").each(function(e) { 
     $(this).attr({'disabled':'disabled','value':'Used'}); 
    }); 
}  

Répondre

2

Cette autre fonction que vous lui transmettez doit l'appeler, sinon c'est inutile.

function someFunctionThatCallsBack(someCallbackFunction) { 
    // do something 
    someCallbackFunction(); // calls the callback function 
} 

Ci-dessus, vous passez une fonction à showUseButtons - mais cette fonction juste ignore. Il ne sera pas appelé, donc tout ce que vous y mettrez ne fera rien.

Peut-être que vous vouliez dire quelque chose comme ce qui suit?

function showUseButtons(callback) { 
    $(".btnUseProduct").each(function(e) { 
     $(this).attr({disabled: true, value:'Used'}); 
    }); 
    callback(); 
}  

En outre, à l'intérieur d'une fonction des changements de contexte (à savoir la valeur de this est différente). Ainsi, vous aurez besoin de modifier votre code un peu ainsi:

var _this = this; // save the context - the clicked DOM element 
    showUseButtons(function(){   
      $(_this).attr({disabled:true, value:'Used'}); //doesn't work 
      $.getJSON("/chinabuy-new/cfcs/services.cfc?method=update_provisioning&returnformat=json&queryformat=column",{"provisioning_id":provisioning_id,"entity_id":entity_id},function(res,code){       
      }); 
    }); 
+0

Cela fonctionne à un degré. Mais j'ai deux boutons qui sont à la fois désactivant. Seul le clic devrait désactiver. Bouton 1 (cliqué): Bouton 2 (non cliqué): Paul

+0

Attendez ... Je pense que je vois ce qui se passe ... accrocher .. Oh, je pensais avoir trouvé le problème mais non. La fonction showUseButtons devrait montrer ne pas se cacher, donc j'ai changé cela. Cependant, au clic, le désactiver ne fonctionne pas. – Paul

+0

@Paul: Les ID d'élément DOM ne doivent pas commencer par un nombre (c'est-à-dire un code HTML non valide), et ne doivent pas contenir '^'. – sje397

-1

Try This ...

$(".btnUseProduct").live("click", function(e) { 

     var clickedId = $(this).attr('id'); 
     var provisioning_id = clickedId.split("^")[0]; 
     var entity_id = clickedId.split("^")[1]; 
     var entity = clickedId.split("^")[2]; 

     showUseButtons(function(){   

        $(this).attr({'disabled':'disabled','value':'Used'}); //doesn't work 
        $.getJSON("/chinabuy-new/cfcs/services.cfc?method=update_provisioning&returnformat=json&queryformat=column",{"provisioning_id":provisioning_id,"entity_id":entity_id},function(res,code){    
     //give class name common for all buttons and make all to hide 
     $("input.button_class_names").css({'visibility' : 'visible'}); 
    //make ur pressed button visible like this   
clickedId.css({'visibility' : 'hidden'}); 
        }); 
      }); 
     e.preventDefault(); 
    }); 

    function showUseButtons() { 
     $(".btnUseProduct").each(function(e) { 
      $(this).attr({'disabled':'disabled','value':'Used'}); 
     }); 
    }