Подключение скриптов Jquery к Drupal 7

Главные вкладки

Аватар пользователя runner12 runner12 29 мая 2012 в 15:39

Здравствуйте. Хочу задать вопрос опытным пользователям Drupal, так как я пока начинающий. Пытаюсь подключить к сайту на Drupal 7 скрипт на Jquery. Прописываю в info файле темы конструкцию scripts[] = js/codes.js. В файле codes.js пишу такой код.

(function ($) {
// All your code here
}(jQuery));

Сохраняю. Очищаю кэш. И - ничего не происходит. Файл скрипта подключается нормально, но код из него не исполняется, даже простейший alert('hello, world'); Объясните, пожалуйста, в чем кроется ошибка.
ЗЫ. Аналогично не работает код подключенный с помощью drupal_add_js().

Комментарии

Аватар пользователя graker graker 29 мая 2012 в 15:50

Наверно, вместо //All your code here надо привести код, который не исполняется, т.е. файл целиком, с реализацией attachBehaviors() например.

Аватар пользователя graker graker 29 мая 2012 в 16:49

runner12 wrote:
Так любой код не исполняется, какой не пишу... Даже alert()

Потому что внутри должно быть ready() или Drupal.attachBehaviors(), наверное.

Аватар пользователя Grayw0lf Grayw0lf 29 мая 2012 в 18:34

Внутри подключаемого скрипта всегда пишу

(function($) {
Drupal.behaviors.myBehavior = {
  attach: function (context) {
  $(document).ready(function() {
    // All your code here
    });
  }
};
})(jQuery);

пока ошибок с работой скриптов не было.
По моему это и есть правильное оформление js-скрипта под друпал, уточнить можно на д.орг.

Аватар пользователя graker graker 30 мая 2012 в 8:59

Grayw0lf wrote:
пока ошибок с работой скриптов не было.
По моему это и есть правильное оформление js-скрипта под друпал, уточнить можно на д.орг.

Да. Только $(document).ready() внутри attach необязательно - код внутри attach и так запустится.

Аватар пользователя graker graker 30 мая 2012 в 16:25

Grayw0lf wrote:
А вот про .once() (jquery.once - jQuery Once (system libraries)), у jquery есть ведь стандартный метод one().
Который существенно отличается от once().

once() - единожды выполняет произвольный код относительно объекта DOM. То есть это слегка более элегантная замена предыдущему (D6) стилю JS-кодирования с использованием context и присвоением-проверкой processed-класса. Благодаря которому (стилю) код не исполняется над объектами при каждом вызове Drupal.attachBehaviors() в чьем-нибудь модуле.

А one() биндит обработчик события (или несколько), который отбиндивается после одного вызова. То есть это как бы про другое.

Аватар пользователя Aurochs@drupal.org Aurochs@drupal.org 10 декабря 2012 в 5:11

Спасибо за подсказку.Прошу прощение за нубство, но мне не совсем понятно зачем к селекторам добавлять "context"? например $('.mydiv', context).once(......
Я вот подгружаю контент с помощью пейджера views load more и селекторы с "context" не работают в подгруженном контенте, но работают с теми селекторами, которые были изначально подгружены в документе. Получается что с помощью "context" я ограничиваю селекторы от работы с элементами, подгруженными через Ajax? Заранее благодарю.
Но вообще не понятно для чео служит context в селекторах.