JQuery и Drupal страница загрузки - PullRequest
7 голосов
/ 15 декабря 2008

Я хотел бы выполнить jQuery $ (document) .ready () на сайте drupal. Хотя я знаю, что могу просто вставить это на страницу индекса, это действительно грязно и взломано.

То, что я хочу знать, - это где находится правильное место для размещения, также необходимо указывать конкретную тему, поскольку я не хочу, чтобы все темы использовали его.

Заранее спасибо за помощь.


Сладкий успех, спасибо вам обоим за помощь, у меня только одна последняя поправка к этому вопросу. Теперь, когда я дошел до этого, мне нужно выполнить код jQuery для обновления документа, могу ли я использовать контекст для изменения документа?

Ответы [ 2 ]

7 голосов
/ 15 декабря 2008

Не специалист по Drupal, но эта запись в блоге предполагает, что начиная с Drupal 6 вам вообще не нужно включать функцию $(document).ready() в наш код jQuery.

Вместо этого вы можете поместить весь код в функцию, назначенную в качестве свойства Drupal.behaviors.

В misc/ directory установки Drupal у нас есть не только файл jquery.js, но у нас также есть drupal.js (и несколько других файлов js, управляющих функциями, специфичными для определенных страниц или функциями администратора, например, upload.js ), который регулирует общее использование jQuery в Drupal.

Он объявляет объект JavaScript Drupal с целью содержать свойства, которые должны быть доступны и использоваться другими js-файлами. Например, свойство Drupal.settings используется для передачи массива настроек модуля в код js для этого модуля. Это можно сделать, просто вызвав drupal_add_js () в вашем php-коде и убедившись, что второй параметр передается как «setting», например:

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

В вашем js-файле вы можете получить доступ к этим настройкам на Drupal.settings.mymodule. Таким образом, вы расширили объект Drupal.settings свойством mymodule, которое само по себе является объектом, содержащим все ваши настройки.

Другим свойством объекта Drupal является объект поведения, то есть Drupal.behaviors, и когда мы хотим, чтобы наш модуль добавил новые поведения jQuery, мы просто расширяем этот объект. Весь код jQuery для вашего модуля может быть структурирован так:

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

Но, вы можете задаться вопросом, все, что делает, это объявляет функцию - как она вообще вызывается? Что ж, это все, что присматривается в drupal.js. Он имеет функцию $(document).ready, которая вызывает функцию Drupal.attachBehaviors, которая, в свою очередь, циклически перебирает объект Drupal.behaviors, вызывая каждое из его свойств, причем все они являются функциями, объявленными различными модулями, как указано выше, и передавая документ как контекст .

Причина, по которой вы делаете это таким образом, заключается в том, что если ваш код jQuery выполняет AJAX-вызовы, в результате которых на страницу добавляются новые элементы DOM, вы можете захотеть, чтобы ваше поведение (например, скрытие всех элементов h3 или чего-либо другого) было присоединено к этому новый контент, а также. Но так как он не существовал, когда DOM был загружен и запущен Drupal.attachBehaviors, к нему не было прикреплено никакого поведения. Однако при вышеописанной настройке все, что вам нужно сделать, это вызвать Drupal.behaviors.myModuleBehavior(newcontext), где newcontext будет новым, AJAX-доставленным контентом, таким образом гарантируя, что поведение не будет привязано ко всему документу во всем снова. Смотрите здесь полный пример того, как использовать этот код

2 голосов
/ 15 декабря 2008

VonC адекватно ответил на часть вопроса «как», поэтому я сосредоточусь на части «где».

Если сценарий зависит от темы, то естественное место для размещения файла сценария находится в вашей теме. Проблема в том, что к тому времени, как Drupal попадает в тему, переменная $scripts уже «визуализируется» (на языке Drupal) в HTML. Чтобы добавить скрипт в слой темы, вам нужно добавить скрипт и пересобрать переменную $scripts.

Предполагая, что вы используете Drupal 6, это будет работать в вашей функции theme_preprocess_page():

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

Просто измените второй аргумент drupal_get_path(), чтобы он отражал название вашей темы, затем измените имя файла сценария с example.js на любое имя, которое вы назвали своим сценарием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...