2009-09-17 6 views
6

J'ai un problème J'utilise les onglets jquery U.I qui chargent tout avec ajax. Maintenant que je l'ai maintenant à chaque fois que vous cliquez sur un onglet, une vue partielle est chargée dans cet onglet. Maintenant, dans cette vue partielle, il existe des fichiers javascript qui utilisent jquery pour lier tous les événements nécessaires dans cet onglet, plus quelques plugins jquery que j'utilise.Est-ce que jquery vit ralentir des sites Web?

Maintenant, chaque fois que cet onglet est chargé tous ces scripts sont chargés. Si on clique 10 fois dessus, alors ces scripts sont chargés 10 fois jusqu'à maintenant chacun de mes boutons aura maintenant 10 des mêmes événements, cela signifie que si quelqu'un clique sur ce bouton 10 événements vont tous se déclencher et faire la même chose.

J'ai donc besoin de trouver une solution pour soit déplacer tout le script et l'avoir sur la page principale et utiliser jquery.live ou une autre solution. J'ai essayé d'utiliser la mise en cache de jquery pour les onglets de l'interface utilisateur, mais cela ne fonctionnera pas car certaines choses dans l'onglet Tab A quand on change l'effet Tab B je dois recharger l'onglet B mais les scripts ne peuvent pas recharger autrement rencontrer le même problème que maintenant.

Répondre

6

Read here pour une présentation agréable couvrant la délégation d'événements de jQuery.

Après avoir lu l'aspect ci-dessus à ceci:

// using jQuery 1.4.2 
(function($){ 
    // You can cache the container you plan on using for event delegation. 
    // If using $(document).ready(...) to call the below functions 
    //  your "container" element should already exist in the DOM 
    // (the .specialAjaxLink elements don't have to exist yet). 
    var container = $("#container"); 

    // whenever an element with the class "specialAjaxLink" is clicked 
    // while inside your container element execute the handler on them. 
    container.delegate(".specialAjaxLink", "click", function(){ 
     // do something amazing... 
     solveWorldHunger(this); 
     // stop propagation and prevent default... 
     return false; 
    }); 
}(jQuery)); 

Vous ne devriez pas avoir à vous soucier des problèmes de performances lors de l'utilisation de la méthode ci-dessus, sauf si vous créez une application aussi complexe que gmail, docs, ou google wave .

2

i toujours, en règle générale, appelle unbind() avant bind()

+0

Je ne suis pas? puis-je voir des exemples? Comment cela fonctionne avec les plugins? Est-il rapide ou lent de le faire alors "en direct"? – chobo2

+0

Aussi fait-il juste juste pour délier tout? – chobo2

+0

appeler unbind() avant remove() et bind() est un bon moyen d'empêcher plusieurs liaisons sur le même élément. Je préfère live() si quelque chose est créé et supprimé beaucoup (comme un effet de survol animé sur les boutons) – Mike

0

Au lieu d'utiliser .live(), pensez à utiliser la délégation de l'événement à la place. Écoutez un événement dans un conteneur, puis inspectez le tag et les attributs pour décider comment le gérer.

Beaucoup plus efficace si vous ajoutez un tas d'éléments au DOM.

+0

Je vais avoir besoin d'exemples car je ne suis pas. – chobo2

+0

Voici un lien rapide - faites défiler vers le bas un peu http://www.learningjquery.com/2008/03/working-with-events-part-1 – ScottE

+0

Je ne suis pas sûr de ce que je devrais regarder. – chobo2

Questions connexes