KindleEditor insertfile初始化多个

复制代码
  KindEditor.ready(function (K) {
            var editor = K.editor({
                allowFileManager: true
            });
            K('#insertfile').click(function () {
                editor.extraFileUploadParams = { "dir2": "productfile" };
                editor.loadPlugin('insertfile', function () {
                    editor.plugin.fileDialog({
                        fileUrl: K('#url').val(),
                        clickFn: function (url, title) {
                            K('#url').val(url);
                            editor.hideDialog();
                        }
                    });
                });
            });

            K("#insertfile2").click(function () {
                editor.extraFileUploadParams = { "dir2": "printDocTemplae" };
                editor.loadPlugin('insertfile', function () {
                    editor.plugin.fileDialog({
                        fileUrl: K('#url_Template').val(),
                        clickFn: function (url, title) {
                            K('#url_Template').val(url);
                            editor.hideDialog();
                        }
                    })
                })
            });
复制代码

修改insertfile获取需要拼进form的参数的方法。

if (allowFileUpload) {
extraParams = K.undef(self.extraFileUploadParams, {})  //在这个地方再次调用给变量extraParams赋值。
//console.log(extraParams);

由于加载一次插件后,第二次插件不会再次初始化,会直接从一个缓存的对象中取。

下面粘贴出来部分 kindeditor.js中创建 plugin对象的方法。

复制代码
 1 loadPlugin: function (name, fn) {
 2             var self = this;
 3             if (_plugins[name]) { // 判断是不是已经存在该插件
 4                 if (self._calledPlugins[name]) {
 5                     if (fn) {
 6 //                        console.log(self);
 7 //                        console.log(fn);
 8                         fn.call(self);
 9                     }
10                     return self;
11                 }
12                 _plugins[name].call(self, KindEditor);
13                 if (fn) {
14                     fn.call(self);
15                 }
16                 self._calledPlugins[name] = true;
17                 return self;
18             }
19             if (self.isLoading) {
20                 return self;
21             }
22             self.isLoading = true;
23             _loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function () {
24                 self.isLoading = false;
25                 if (_plugins[name]) {
26                     self.loadPlugin(name, fn);
27                 }
28             });
29             return self;
30         }
复制代码

调了很久,才慢慢调通该插件。最早是同事大哥帮忙,尝试给需要动态的修改的extraFileUploadParams赋值,然后分步骤

用console.log()输出变量到底是什么,非常重要的一步是在插件代码insertfile中再次输出变量extraParams,但是发现第二次根本没输出。

然后知道了,第二次使用插件其实不是再次初始化,是直接使用了第一次初始化的对象。

     然后就继续向下跟踪,因为提前已经通过F12查看,知道之所以能将扩展参数提交到服务器,是因为插件把参数动态拼到插件创建的form表单中了。

所以就想办法知道到底哪里是动态拼form元素的地方。最后找到了动态创建表单的地方:var uploadbutton = K.uploadbutton({

复制代码
 function KUploadButton(options) {
        this.init(options);
    }
    _extend(KUploadButton, {
        init: function (options) {
            var self = this,
            button = K(options.button),
            fieldName = options.fieldName || 'file',
            url = options.url || '',
            title = button.val(),
            extraParams = options.extraParams || {},
            cls = button[0].className || '',
            target = options.target || 'kindeditor_upload_iframe_' + new Date().getTime();
            options.afterError = options.afterError || function (str) {
                alert(str);
            };
            var hiddenElements = [];
            for (var k in extraParams) {
                hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
            }
            var html = [
复制代码

然后发现了了构建form的原理。就知道需要在构建form前,修改提供的参数数据源:extraParams

然后本来企图在初始方法内部定义一个方法,修改插件内部的变量(闭包)但是一直报错,没有定义变量。所以就换了一个方法,这个时候

灵光一闪,发现初始化的时候既然是从K中拿数据库。我们就在再次构建的地方再次给变量赋一次值不就行了吗?

然后就有了:extraParams = K.undef(self.extraFileUploadParams, {}) 

 

以上总结,调了很久的js才有这些心得,js学的还是太差了。为了理解call()方法,call方法使用:

self是一个很复杂的对象,有各种方法。 fn是一个方法,放内部调用的是self中的一个方法。

fn.call(self);

还是没太理解:

---------------------------------------------------

作者:赵望野
链接:https://www.zhihu.com/question/20289071/answer/14745394
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。因为 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。

二者的作用完全一样,只是接受参数的方式不太一样。例如,有一个函数 func1 定义如下:
var func1 = function(arg1, arg2) {};

就可以通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。其中 this 是你想指定的上下文,他可以任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。
-----------------------------------------------------------------

 

posted on   荆棘人  阅读(363)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示