[Решено] JS выполняется два раз

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

Аватар пользователя nitskel nitskel 24 ноября 2014 в 10:18

Знаю, что тема изъезжена но все же не могу понять в чем косяк.

В файле template.php подключаю bootstrap.js

function bartik_preprocess_page(&$variables){
  drupal_add_js(drupal_get_path('theme', 'bartik') . '/js/bootstrap.js');
  ...

При админе все ведет себя правильно, а вот при госте по какой-то причине код выполняется два раза.

Есть у кого какие соображения?

Комментарии

Аватар пользователя nitskel nitskel 27 ноября 2014 в 13:25

Народ, помогите пожалуйста. Реальная проблема. Как победить не понимаю.

Хотя бы подтолкните на какие-нибудь мысли. Плагины разные отключать пробовал, не помогло.

Можно пойти путем и переписать код с использованием костылей (доп. классов), но я ведь библиотеку бутстрап как раз для простоты разработки прикрепил.

Аватар пользователя Orion76 Orion76 27 ноября 2014 в 15:18

На основании какой информации строить предположения?
Какой код 2 раза выполняется?
Логи js-консоли браузера..
Стек вызова функций..
и т.д.

Аватар пользователя nitskel nitskel 27 ноября 2014 в 15:58

Вводная информация к сожалению только одна.
Это то, что под залогининым пользователем все работает, а под гостем нет.

Конкретно, у меня глючит bootstrap.js, который подключается в файле template.php
А именно при клике на раскрывающие элементы (data-toggle=dropdown) он обрабатывает два клика, вместо одного, и элемент мгновенно закрывается обратно.

Лог js-консоли чист.

Спасибо, что отозвались, сейчас пойду гуглить про стек вызова функций, что это и как узнать.

Но я грешу на кэш. Хотя галочка "Кэшировать страницы для анонимных пользователей" не стоит и объединения js-фалов тоже нет.

Аватар пользователя nitskel nitskel 28 ноября 2014 в 11:57

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

Может тут jQueryUpdate замешан? Я его отключал, но не удалял. Никаких изменений не было.

Аватар пользователя nitskel nitskel 1 декабря 2014 в 2:59

Простите, что опять поднимаю тему. Но все проблема все не решается.

Но нашел ряд странностей.

В тему вставил hook_js_alter. Оказалось, что он исполняется 3 раза.

Еще нашел статью на англ. и вроде как по теме, но что-то до конца понять не могу.
http://drupal.stackexchange.com/questions/23983/drupal-add-js-causes-blo...

Аватар пользователя nitskel nitskel 1 декабря 2014 в 3:05

Ура!!!
Помог перенос функции drupal_add_js() из хука _preprocess_page в хук _preprocess_html

Если кто знает нюансы такого поведения друпала (про хуки) был бы рад послушать или почитать.

Аватар пользователя nitskel nitskel 11 декабря 2014 в 16:23

Отвечу про нюансы, которые произошли при таком решении.

В хуке _preprocess_html библиотека bootstrap.js стала подключаться самой последней. Поэтому вызову функций из библиотеки через javascript уже полностью доверять нельзя. Возможно можно их вызывать в конце шаблонов, но я так не делал.

Зато, все стало отлично работать, если вызывать эти функции через атрибуты 'data-target' и др. В документации все написано.