2008-12-15 11 views
7

Je voudrais exécuter jQuery $ (document) .ready() dans un site drupal. Alors que je sais que je peux juste le coller dans la page d'index, c'est vraiment salissant et un hack. Ce que je veux savoir est où est l'emplacement correct pour mettre ceci, il devrait également être spécifique de thème car je ne veux pas que tous les thèmes l'emploient.Chargement de la page jQuery et Drupal

Merci d'avance pour l'aide.


Doux succès, merci à vous deux pour l'aide, je viens d'avoir un dernier amendement à cette question. Maintenant que j'en suis arrivé là, j'ai besoin d'exécuter le code jQuery pour mettre à jour le document, puis-je utiliser le contexte pour modifier le document?

Répondre

2

VonC a répondu correctement à la partie «comment» de la question, je vais donc me concentrer sur la partie «où».

Si le script est spécifique à un thème, l'emplacement naturel du fichier de script est dans votre thème. Le problème est que lorsque Drupal arrive au thème, la variable $scripts a déjà été "rendue" (en langage Drupal) en HTML. Pour ajouter un script dans le calque de thème, vous devez ajouter le script et reconstruire la variable $scripts.

En supposant que vous utilisez Drupal 6, cela irait dans votre theme_preprocess_page() fonction:

drupal_add_js(drupal_get_path('theme', 'theme_name') .'/example.js', 'theme'); 
$variables['scripts'] = drupal_get_js(); 

il suffit de changer le deuxième argument de drupal_get_path() pour refléter le nom de votre thème, puis modifiez le nom du fichier de script de example.js à tout ce que vous avez nommé votre script.

7

Ce n'est pas un spécialiste de Drupal, mais ce blog entry suggère que, à partir de Drupal 6, vous n'avez pas besoin d'inclure la fonction $(document).ready() dans notre code jQuery. Au lieu de cela, vous pouvez mettre tout le code dans une fonction que vous affectez en tant que propriété Drupal.behaviors.

Dans le misc/ directory de l'installation de Drupal, nous avons non seulement le fichier jquery.js mais nous avons aussi drupal.js (et plusieurs autres fichiers, le contrôle des fonctionnalités spécifiques à certaines pages ou fonctions d'administration, par exemple le téléchargement. js), qui régit l'utilisation générale de jQuery dans Drupal.

Il déclare l'objet JavaScript Drupal dans le but de contenir les propriétés qui doivent être accédées et utilisées par d'autres fichiers js. Par exemple, la propriété Drupal.settings est utilisée pour transmettre un tableau de paramètres de module au code js de ce module. Pour ce faire, tout simplement en appelant drupal_add_js() dans votre code php et vous assurant que le second paramètre est passé en tant que « réglage », par exemple:

drupal_add_js(array('mymodule' => $array_of_settings), 'setting'); 

Dans votre fichier js, puis, vous pouvez accéder à ces paramètres à Drupal.settings.mymodule. Vous avez ainsi étendu l'objet Drupal.settings avec la propriété mymodule, qui est elle-même un objet contenant tous vos paramètres.

Une autre propriété de l'objet Drupal est l'objet de comportement, c'est-à-dire Drupal.behaviors, et lorsque nous souhaitons que notre module ajoute de nouveaux comportements jQuery, nous étendons simplement cet objet. pourrait être structuré comme celui-ci l'intégralité du code jQuery pour votre module:

Drupal.behaviors.myModuleBehavior = function (context) 
{ 
    //do some fancy stuff 
}; 

Mais, vous pouvez vous demander, tout ce qui ne fait déclarer une fonction - la façon dont il n'a même appelé? Eh bien, tout cela est pris en charge dans drupal.js. Il a une fonction $(document).ready qui appelle la fonction Drupal.attachBehaviors, qui à son tour parcourt l'objet Drupal.behaviors appelant chacune de ses propriétés, toutes étant des fonctions déclarées par différents modules comme ci-dessus, et passant dans le document le contexte. La raison pour cela est que si votre code jQuery fait des appels AJAX qui entraînent l'ajout de nouveaux éléments DOM à la page, vous pourriez vouloir que vos comportements (par exemple cacher tous les éléments h3 ou quoi que ce soit) soient attachés à ce nouveau contenu aussi bien. Mais puisqu'il n'existait pas lorsque le DOM a été chargé et que Drupal.attachBehaviors a été exécuté, il n'a aucun comportement associé.Avec la configuration ci-dessus, cependant, tout ce que vous devez faire est d'appeler Drupal.behaviors.myModuleBehavior(newcontext), où newcontext serait le nouveau contenu AJAX, assurant ainsi que les comportements ne sont pas attachés à tout le document à nouveau. Voir ici pour l'exemple complet de la façon d'utiliser ce code

+0

En fait, vous devriez appeler Drupal.attachBehaviors (newcontext) pour laisser tous les comportements enregistrés traiter l'élément newcontext (et ses enfants). –

Questions connexes