once - Carga de página de jQuery y Drupal
once drupal 7 (2)
Me gustaría ejecutar jQuery $ (document) .ready () en un sitio drupal. Si bien sé que puedo ponerlo en la página de índice, esto es realmente complicado y un truco.
Lo que quiero saber es dónde está la ubicación correcta para poner esto, también debería ser específico del tema ya que no quiero que todos los temas lo usen.
Gracias de antemano por la ayuda.
Dulce éxito, gracias a los dos por la ayuda, solo tengo una última enmienda a esta pregunta. Ahora que he llegado tan lejos, necesito ejecutar el código jQuery para actualizar el documento, ¿puedo usar el contexto para modificar el documento?
No es un especialista de Drupal, pero esta entrada de blog sugiere que, a partir de Drupal 6, no es necesario que incluya la función $(document).ready()
en nuestro código jQuery.
En su lugar, puede poner todo el código dentro de una función que asigne como propiedad de Drupal.behaviors
.
En el
misc/ directory
de la instalación de Drupal, no solo tenemos el archivo jquery.js, sino que también tenemos drupal.js (y varios otros archivos js, que controlan la funcionalidad específica de ciertas páginas o funciones de administración, por ejemplo, upload.js), que rige el uso general de jQuery en Drupal.Declara el objeto JavaScript de Drupal con el fin de contener propiedades que necesitan ser accedidas y utilizadas por otros archivos js. Por ejemplo, la propiedad Drupal.settings se usa para pasar una matriz de configuraciones de módulos al código js para ese módulo. Para ello, simplemente llame a drupal_add_js () en su código php y asegúrese de que el segundo parámetro se transfiera como "configuración", por ejemplo:
drupal_add_js(array(''mymodule'' => $array_of_settings), ''setting'');
En su archivo js, puede acceder a esta configuración en Drupal.settings.mymodule. De este modo, ha extendido el objeto Drupal.settings con la propiedad mymodule, que es en sí misma un objeto que contiene todas sus configuraciones.
Otra propiedad del objeto Drupal es el objeto de comportamientos, es decir, los comportamientos
Drupal.behaviors
, cuando queremos que nuestro módulo agregue nuevos comportamientos jQuery, simplemente ampliamos este objeto. El código jQuery completo para su módulo podría estructurarse así:
Drupal.behaviors.myModuleBehavior = function (context)
{
//do some fancy stuff
};
Pero, se puede preguntar, todo lo que hace es declarar una función, ¿cómo se llama? Bueno, eso es todo cuidado en drupal.js. Tiene una función
$(document).ready
que llama a la funciónDrupal.attachBehaviors
, que a su vez realiza un ciclo a través del objetoDrupal.behaviors
llamando a cada una de sus propiedades, todas estas funciones son declaradas por varios módulos como seDrupal.behaviors
anteriormente, y pasan el documento como el contexto .La razón para hacerlo de esta manera es que si su código jQuery realiza llamadas AJAX que dan como resultado la adición de nuevos elementos DOM a la página, puede desear que sus comportamientos (por ejemplo, ocultar todos los elementos h3 o lo que sea) se adjunten a ese nuevo contenido como bien. Pero dado que no existía cuando se cargó el DOM y se ejecutó
Drupal.attachBehaviors
, no tiene ningún comportamiento asociado. Sin embargo, con la configuración anterior, todo lo que necesita hacer es llamar aDrupal.behaviors.myModuleBehavior(newcontext)
, dondenewcontext
sería el nuevo contenido entregado por AJAX, asegurando así que los comportamientos no se unan al conjunto documentar todo de nuevo. Vea aquí el ejemplo completo de cómo usar este código
VonC respondió adecuadamente la parte de "cómo" de la pregunta, por lo que me centraré en la parte "dónde".
Si la secuencia de comandos es específica del tema, el lugar natural para colocar el archivo de secuencia de comandos está en su tema. El problema es que cuando Drupal llega al tema, la variable $scripts
ya se ha "renderizado" (en el lenguaje de Drupal) en HTML. Para agregar una secuencia de comandos en la capa de tema, debe agregar la secuencia de comandos y reconstruir la variable $scripts
.
Suponiendo que estés usando Drupal 6, esto iría en tu función theme_preprocess_page()
:
drupal_add_js(drupal_get_path(''theme'', ''theme_name'') .''/example.js'', ''theme'');
$variables[''scripts''] = drupal_get_js();
Simplemente cambie el segundo argumento de drupal_get_path()
para reflejar el nombre de su tema, luego cambie el nombre del archivo de script de example.js
a lo que haya llamado su script.