2010-06-10 5 views
0

Je suis en train de développer un widget. Le widget comporte trois onglets implémentés de la manière suivante. Le problème que j'ai est que le code jquery qui a écrit est très lent. Si l'utilisateur modifie rapidement les onglets, le widget devient béant et s'enlise. Cela provoque l'alignement des onglets avec les données affichées et un décalage général. Je crois que c'est parce que l'onglet est changé avant que $ .load() soit fini. J'ai essayé de mettre en œuvre ce qui suit:Optimisation de jQuery pour les onglets

("#tabs li a").click(function() 
{ 
$("#tabs li.active").removeClass("active"); 
    $("#tab_content").load($(this).attr('href'), function(){ 
     $(this).parent().addClass("active"); 
    }); 

    return false; 
}); 

Je crois comprendre que la fonction de rappel au sein de la fonction de charge n'exécute pas jusqu'à ce que la fonction de charge est terminée. Je pense que cela résoudrait mon problème, mais je ne peux pas trouver un moyen de sélectionner l'onglet correct qui a été cliqué dans la fonction de rappel. Si ce n'est pas le moyen de le faire, quelle est la meilleure façon de mettre en œuvre ces onglets afin qu'ils arrêtent de charger une ancienne requête et de charger la dernière sélection d'onglet par l'utilisateur?

Merci

Répondre

1

Peu importe si vous devez utiliser les onglets de l'interface utilisateur jQuery ou non, cela est la façon dont votre code pourrait être fait pour travailler

$("#tabs li a").click(function(e) 
{ 
    var fn = function(a) { 
     return function() { 
      $(a).parent().addClass("active"); 
     }; 
    } 
    $("#tabs li.active").removeClass("active"); 
    $("#tab_content").load($(this).attr('href'), fn(this)); 

    return false; 
}); 
+0

Merci pour ce code. Cela fonctionne et la fonction de rappel est en cours d'exécution correctement. Cependant, le problème persiste et est peut-être un peu pire lorsque les onglets sont changés rapidement. Donc, est-il possible d'annuler la requête AJAX une fois qu'une autre est faite? Je pense que la façon dont je fais cela est fondamentalement défectueuse. – dbaugh

+0

Si la demande a été/est en cours de traitement par le serveur, il y a peu de choses que vous pouvez faire. Mais jetez un coup d'oeil [ici] (http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery) pour savoir comment vous pouvez annuler une demande –

+0

Juste pour apprendre car je suis encore un peu rouillé avec jQuery et javascript en général, pourquoi avez-vous passé 'e' comme paramètre pour la fonction dans la fonction click? – dbaugh

2

Pourquoi ne pas simplement utiliser le jQuery UI Tabs plug-in?

+0

Vous pouvez faire une version personnalisée de jQueryUI (à droite sur leur site web) qui ne inclut le plug-in d'onglets et ses dépendances si vous êtes préoccupé par la taille du fichier. – lambacck

+0

Nous utilisons jQuery pour bien plus que ces onglets. Je ne pense pas que le problème est avec la taille du fichier, je pense que c'est avec $ .load() finissant avant que l'on clique sur l'onglet suivant et que les requêtes soient récupérées. – dbaugh