我正在制作一个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的功能可用于主插件模块?
答案 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
。