【问题标题】:Plugin function 'is not defined' with drupal behaviors带有drupal行为的插件功能“未定义”
【发布时间】:2012-03-25 04:09:29
【问题描述】:

我无法在 drupal 模块中正确执行函数。它用于 projekktor HTML5 视频播放器的第三方集成。我在 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.ini 传递的数组。 'jspath' 只是库文件的字符串。 'jsoptions' 是播放器选项。那部分工作正常。我就是无法让播放器正确启动。

它确实可以从内联 $(document).ready 函数初始化。但这在这里并不是一个真正可行的选择。

有什么想法吗?

编辑: 在查看了未缩小的 projekktor 代码后,我发现了为什么这不起作用。似乎函数是这样声明的:

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

它是文档就绪范围内的函数声明。

所以现在我对如何使用头脚本(没有 $.get)在我的函数中触发它有点茫然。

考虑到它是一个第三方库被集成到一个 drupal 模块中,我有点束手无策。

【问题讨论】:

    标签: jquery drupal jquery-plugins


    【解决方案1】:

    全局 projekktor 在 dom 准备好后声明。所以你也应该在 dom 准备好之后使用它。将您的代码也放入 dom 就绪回调函数中。

    试试:

    (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);
                        });
                    })
                }
            }
        };
    });
    

    【讨论】:

    • 感谢您的建议。我之前尝试过第二个建议无济于事。第一个建议也不是快乐。这些脚本不会引发错误,但播放器只是没有初始化。
    • 我发现了问题,并得到了解决。 projekktor 库被封装在一个文档就绪函数中。通常像这样的库是在一个自执行函数中。 Drupal 在文档就绪功能中也有 jquery 和 drupal js。因此,projekktor 库需要在 jquery 之前的页面上出现一次。
    • @user1290816 您能否将您的解决方案作为单个答案发布并在答案处标记?这将以适当的方式向其他用户展示正确的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2021-06-20
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多