2011-12-21 1 views
1

j'ai et scripts JS externes fichier avec tous mes objets qui fonctionne une fois que le document est prêt quelque chose comme ça ...Quel est le meilleur moyen de charger les propriétés JS orientées objet dépendant de la page?

jQuery(function($) { 
    var Main = { 
     run: function() { 
      myFunction.setup(); 
     } 
    } 

    var myFunction = { 
     setup: function() { 
      //Do some stuff here 
     } 
    } 

    Main.run(); 
}); 

Je veux être en mesure d'exécuter myFunction.setup() que si im sur une certaine page sinon j'obtiens des erreurs si cette méthode cherche des éléments sur la page qui n'existent pas par exemple un diaporama, des menus etc.

En ce moment j'ai contourné ceci en vérifiant si l'élément existe avec. longueur et si cela fonctionne alors le reste de la méthode, mais je me demandais s'il y avait une meilleure façon? Peut-être comme s'il était possible d'envoyer des variables au fichier de scripts lorsqu'il se charge en fonction de la page im on afin qu'il sache ce que les méthodes exécutent?

Toute aide serait vraiment appréciée.

Merci

Giles

Répondre

1

Paul Irish a un excellent moyen de faire exactement cela, en utilisant ID et les classes de l'étiquette de corps pour exécuter certains blocs de code:

http://paulirish.com/2009/markup-based-unobtrusive-comprehensive-dom-ready-execution/

+0

Merci Mathletics, je le faisais exactement sur un autre site mais je n'étais pas sûr que c'était correct, vu que Mr Irish est faire la même chose est gratifiant et l'article vidget semble vraiment une belle façon de le faire! –

0

Cette genre de chose pourrait aider:

Page spécifique

var page_config = { 
    setup_allowed: true 
    // ... more config 
}; 

Générique

var Main, 
    myFunction; 

(function ($, _config) { 
    myFunction = (function() { 
     var _public = {}; 
     if (_config.setup_allowed === true) { 
      _public.setup = function() { 

      }; 
     } 
     return _public; 
    })(); 

    Main = (function() { 
     var _public = {}; 
     if (typeof myFunction.setup !== "undefined") { 
      _public.run = function() { 
       myFunction.setup(); 
      }; 
      // Run it as we had Main.run() before 
      _public.run(); 
     } 
     return _public; 
    })(); 

})(jQuery, page_config); 

De cette façon Main.run() et myFunction.setup() ne sont disponibles que si cela est spécifié dans page_config.

Voici un working example avec lequel vous pouvez jouer. Cela peut être un peu verbeux pour votre exigence particulière, mais j'espère que cela aidera d'une certaine manière :-)

+0

Merci pour l'exemple Jake, un peu plus complexe que ce que je peux faire pour le moment, est-ce que page_config est une variable globale définie sur la page que je suppose? –

+0

Désolé, ça a l'air bien dans ma tête mais je me suis un peu plus complexé quand je l'ai écrit :-) Oui, 'page_config' est simplement une variable globale dans chacune de vos pages; le reste serait simplement contenu dans un fichier JS importé sur chaque page. Le code utilise le [motif de conception de module] (http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth) pour conditionnellement inclure 'function's seulement si spécifié dans' page_config' . – jabclab

+0

Merci Jake, oui ça sonne bien en théorie, theres quelque chose à propos d'avoir javascript sur la page bien que je ne suis pas intéressé, bizarre je sais ha! Quoi qu'il en soit je suis allé avec l'autre approche de mettre des attributs de données sur la sortie de l'étiquette de corps via le php qui fonctionne bien. Je pourrais cependant donner une approche à mon prochain projet, merci encore pour votre temps. –

Questions connexes