2009-12-25 5 views
3

J'ai un peu de problème avec certains jquery. Le code fonctionne bien, mais il s'exécute trop rapidement, même à l'intérieur de tout le fichier $ .document (ready). Essentiellement, j'ai une couche de données chargée à partir d'une base de données - et ensuite le .sortable lui est appliqué. Le contenu .sortable est appliqué avant la fin du dessin HTML. Des idées?jquery s'exécute trop vite

La zone marquée ci-dessous est où le problème est./Clouds/List est un ActionResult dans ASP.NET MVC qui récupère la liste et dessine la vue partielle, mais cela prend plus de temps que jQuery ne l'exécute.

<script type="text/javascript"> 
    $(function() { 
     $("#floating").load("/Tags/List"); 
     **$("#listing").load("/Clouds/List");** 

     $(".sortable").sortable({ 
      connectWith: '.connectable', 
      dropOnEmpty: true, 
      receive: function (event, ui) { 
       var tag = $(ui.item).attr("id").replace(/t/, ""); 
       var parent_id = $(ui.item).parent().attr('id'); 
       $.post("/Clouds/Insert", { cloud: parent_id, tag: tag }); 
      }, 
      remove: function (event, ui) { 
       var tag = $(ui.item).attr("id").replace(/t/, ""); 
       var parent_id = $(ui.item).parent().attr('id'); 
       $.post("/Clouds/Remove", { cloud: parent_id, tag: tag }); 
      } 
     }).disableSelection(); 

    }); 
</script> 
+1

Ce n'est pas une question de rapidité, c'est une question de quand. Même si votre code a pris 5 ans pour s'exécuter, vous rencontrerez toujours le même problème: rien n'est fait pendant l'exécution de votre code; tout se passe avant ou après. –

Répondre

8

Vous pouvez utiliser l'argument de rappel de $.load, à excute la méthode sortableaprès le code HTML a été injecté dans les DOM:

$("#listing").load("/Clouds/List", function() { 
    $(".sortable").sortable({ 
      connectWith: '.connectable', 
      dropOnEmpty: true, 
      receive: function (event, ui) { 
        var tag = $(ui.item).attr("id").replace(/t/, ""); 
        var parent_id = $(ui.item).parent().attr('id'); 
        $.post("/Clouds/Insert", { cloud: parent_id, tag: tag }); 
      }, 
      remove: function (event, ui) { 
        var tag = $(ui.item).attr("id").replace(/t/, ""); 
        var parent_id = $(ui.item).parent().attr('id'); 
        $.post("/Clouds/Remove", { cloud: parent_id, tag: tag }); 
      } 
     }).disableSelection(); 
    }); 
+0

Cela a fonctionné à merveille! – Ciel

+0

C'est génial. Cela a tellement augmenté ma connaissance de jQuery, je ne peux pas croire à quel point c'est utile. Il supprime tant de problèmes que j'ai rencontrés avec jQuery en cours d'exécution avant d'autres JavaScript. Absolument ingénieux! Merci donc, tellement, pour votre aide. – Ciel

+0

De rien Stacey! Je suis heureux d'aider! – CMS

2

fonction de la charge de JQuery accepte un rappel qui est appelée lorsque la réponse est reçue. Effectivement, vous pouvez vous assurer que sortable ne sera pas appelé avant le chargement des données.

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#floating").load("/Tags/List"); 
     $("#listing").load("/Clouds/List", {}, function() { 

      $(".sortable").sortable({ 
        connectWith: '.connectable', 
        dropOnEmpty: true, 
        receive: function (event, ui) { 
          var tag = $(ui.item).attr("id").replace(/t/, ""); 
          var parent_id = $(ui.item).parent().attr('id'); 
          $.post("/Clouds/Insert", { cloud: parent_id, tag: tag }); 
        }, 
        remove: function (event, ui) { 
          var tag = $(ui.item).attr("id").replace(/t/, ""); 
          var parent_id = $(ui.item).parent().attr('id'); 
          $.post("/Clouds/Remove", { cloud: parent_id, tag: tag }); 
        } 
      }).disableSelection(); 
     }); 
    }); 
</script> 
+0

Je ne sais pas qui tu es, mais je t'aime aussi. – Ciel

Questions connexes