Здравствуйте. Хочу задать вопрос опытным пользователям Drupal, так как я пока начинающий. Пытаюсь подключить к сайту на Drupal 7 скрипт на Jquery. Прописываю в info файле темы конструкцию scripts[] = js/codes.js. В файле codes.js пишу такой код.
// All your code here
}(jQuery));
Сохраняю. Очищаю кэш. И - ничего не происходит. Файл скрипта подключается нормально, но код из него не исполняется, даже простейший alert('hello, world');
Объясните, пожалуйста, в чем кроется ошибка.
ЗЫ. Аналогично не работает код подключенный с помощью drupal_add_js().
Комментарии
Наверно, вместо //All your code here надо привести код, который не исполняется, т.е. файл целиком, с реализацией attachBehaviors() например.
Так любой код не исполняется, какой не пишу... Даже alert()
Потому что внутри должно быть ready() или Drupal.attachBehaviors(), наверное.
Вот так попробуйте:
// код
})(jQuery);
Кстати, здесь альтернативный вариант подключения JavaScript.
Внутри подключаемого скрипта всегда пишу
Drupal.behaviors.myBehavior = {
attach: function (context) {
$(document).ready(function() {
// All your code here
});
}
};
})(jQuery);
пока ошибок с работой скриптов не было.
По моему это и есть правильное оформление js-скрипта под друпал, уточнить можно на д.орг.
Да. Только $(document).ready() внутри attach необязательно - код внутри attach и так запустится.
Огромное спасибо, все заработало! Всем откликнувшимся - респект!
Думаю что соглашусь, на д.орг так советуют
Drupal.behaviors.naturalessenceTheme = {
attach: function(context, settings) {
/*Add your js code here*/
}
};
})(jQuery);
ну и еще по этой теме http://www.drupal.ru/node/50926 .
И еще про .once() не надо забывать.
Вообщем все о чем говорили есть в доке http://drupal.org/node/171213 . А вот про .once() (jquery.once - jQuery Once (system libraries)), у jquery есть ведь стандартный метод one().
once() - единожды выполняет произвольный код относительно объекта DOM. То есть это слегка более элегантная замена предыдущему (D6) стилю JS-кодирования с использованием context и присвоением-проверкой processed-класса. Благодаря которому (стилю) код не исполняется над объектами при каждом вызове Drupal.attachBehaviors() в чьем-нибудь модуле.
А one() биндит обработчик события (или несколько), который отбиндивается после одного вызова. То есть это как бы про другое.
Спасибо за подсказку.Прошу прощение за нубство, но мне не совсем понятно зачем к селекторам добавлять "context"? например
$('.mydiv', context).once(......
Я вот подгружаю контент с помощью пейджера views load more и селекторы с "context" не работают в подгруженном контенте, но работают с теми селекторами, которые были изначально подгружены в документе. Получается что с помощью "context" я ограничиваю селекторы от работы с элементами, подгруженными через Ajax? Заранее благодарю.
Но вообще не понятно для чео служит context в селекторах.