使用Moodle插件中的外部JavaScript库中的函数

时间:2017-06-30 21:55:01

标签: javascript php plugins external moodle

我正在制作一个Moodle插件,并希望使用bowser来检测用户的网络浏览器。我通过添加

引用了该文件
$PAGE->requires->js( new moodle_url($CFG->wwwroot.MOODLE_TINYMCE_RECORDRTC_ROOT.'tinymce/js/bowser.js') );

在插件的plugintype_pluginname.php文件(当然是占位符)中,我从插件的bowser文件中调用module.js函数。

当我加载插件时(它在TinyMCE中显示为一个按钮),控制台抛出ReferenceError: bowser not defined,所以我假设这意味着Moodle不会使Bowser中的功能全局可用。

我在许多地方读过许多我需要将我的代码包装在AMD中的东西,或其他类似的东西,但经过大量的阅读后,它仍然在我脑海中浮现。有没有办法让bowser的功能可用于主插件模块?

1 个答案:

答案 0 :(得分:1)

注意:这适用于Moodle 3.3.2,ymmv。

bowser.js放入my_plugin_folder/amd/src/

使用原始bowser.js后,我获得Uncaught TypeError: bowser._detect is not a function。我并不完全理解为什么会收到此错误,但这是修复此错误的一种方法:将bowser.js中的顶部代码块替换为this one中的umdjs/umd。< / p>

您的文件现在应如下所示:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define([], factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals (root is window)
        root.returnExports = factory();
    }
}(typeof self !== 'undefined' ? self : this, function () {

    // module definition here

    return bowser
}));

Moodle将所有JavaScript模块捆绑在一起,这样客户就不需要执行单独的HTTP请求来获取每个模块。此捆绑包称为first.js。它包含所有不加载的模块。如果你现在加载一个Moodle页面,它应该包含bowser.js的内容,其中一些值被Moodle取代。

如果您不想在每个页面上加载bowser,您只需将其重命名为bowser-lazy.js即可。然后它只应在你使用时加载。

您可以通过调用

来测试它是否有效
require(['plugintype_pluginname/bowser'], function(bowser) {
    var ua = bowser._detect(navigator.userAgent);
    console.log(ua);
});

如果您想使用延迟加载,似乎需要更改require来电使用bowser-lazy来代替bowser