Функция плагина "не определена" с поведением drupal - PullRequest
0 голосов
/ 25 марта 2012

У меня проблемы с получением функции для правильного выполнения в модуле drupal. Это для сторонней интеграции HTML5-плеера projekktor. Я не смог найти никакой полезной информации на drupal.org.

(function($) {

Drupal.behaviors.projekktor = {
  attach: function(context, settings) {
    if ($(settings.projekktor.instances).length) {
      $('[id^="projekktor-"]', context).once('projekktor', function() {
        $(this).each(function() {
          var id = $(this).attr('id');
          var jsoptions = settings.projekktor.instances[id];
          var jspath = settings.projekktor.jspath;
          // @WTF: returns 'projekktor is not defined' if $.get isn't used
          $.get(jspath, function() {
            projekktor('#' + id, jsoptions);
          });
        });
      })
    }
  }
};

})(jQuery);

Библиотека projekktor загружается в голову. Но по какой-то причине проигрыватель не будет инициализироваться, если я не добавлю библиотеку в функцию $ .get. И это заставляет вещи работать мучительно медленно.

Настройки содержат массивы, которые передаются с php. «jspath» - это просто строка в файле библиотеки. «jsoptions» - это варианты игрока. Эта часть отлично работает. Я просто не могу заставить плеер правильно запускаться.

Он инициализируется нормально из встроенной функции $ (document) .ready. Но это не совсем приемлемый вариант.

Есть идеи?

EDIT: Я понял, почему это не работает, посмотрев на унифицированный код projekktor. Кажется, функция объявлена ​​так:

jQuery(function($) {
    projekktor = $p = function() {
        /* projekktor code in here */
    }
});

Это объявление функции в области видимости документа.

Так что теперь я немного растерялся из-за того, как я могу запустить его в своей функции, используя скрипт заголовка (без $ .get).

Учитывая, что это сторонняя библиотека, интегрируемая в модуль drupal, я немного расстроен.

1 Ответ

0 голосов
/ 28 марта 2012

Глобальный projekktor объявляется после того, как DOM готов.Так что вы должны использовать это после того, как дом готов тоже.Поместите свой код в функцию обратного вызова dom ready.

Попробуйте:

(function ($) {
    $(function () {
        Drupal.behaviors.projekktor = {
            attach: function (context, settings) {
                if ($(settings.projekktor.instances).length) {
                    $('[id^="projekktor-"]', context).once('projekktor', function () {
                        $(this).each(function () {
                            var id = $(this).attr('id');
                            var jsoptions = settings.projekktor.instances[id];
                            var jspath = settings.projekktor.jspath;
                            projekktor('#' + id, jsoptions);
                        });
                    })
                }
            }
        };
    });
})(jQuery);

Или просто:

jQuery(function ($) {
    Drupal.behaviors.projekktor = {
        attach: function (context, settings) {
            if ($(settings.projekktor.instances).length) {
                $('[id^="projekktor-"]', context).once('projekktor', function () {
                    $(this).each(function () {
                        var id = $(this).attr('id');
                        var jsoptions = settings.projekktor.instances[id];
                        var jspath = settings.projekktor.jspath;
                        projekktor('#' + id, jsoptions);
                    });
                })
            }
        }
    };
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...