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对象的方法。
loadPlugin: function (name, fn) {
var self = this;
if (_plugins[name]) { // 判断是不是已经存在该插件
if (self._calledPlugins[name]) {
if (fn) {
// console.log(self);
// console.log(fn);
fn.call(self);
}
return self;
}
_plugins[name].call(self, KindEditor);
if (fn) {
fn.call(self);
}
self._calledPlugins[name] = true;
return self;
}
if (self.isLoading) {
return self;
}
self.isLoading = true;
_loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function () {
self.isLoading = false;
if (_plugins[name]) {
self.loadPlugin(name, fn);
}
});
return self;
}
调了很久,才慢慢调通该插件。最早是同事大哥帮忙,尝试给需要动态的修改的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 这个数组来便利所有的参数。
KindleEditor insertfile初始化多个的更多相关文章
- Java初始化过程
这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...
- nginx源码分析之模块初始化
在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- Git学习笔记一:新建本地仓库及初始化
1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...
- Spring MVC初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
- SpringMVC初始化参数绑定--日期格式
一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...
- SpringMvc中初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
随机推荐
- ID3和C4.5、CART
CART连续属性参考C4.5的离散化过程,区别在于CART算法中要以GiniGain最小作为分界点选取标准.是否需要修正?处理过程为: 先把连续属性转换为离散属性再进行处理.虽然本质上属性的取值是连续 ...
- Java8函数之旅 (二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- apache单ip配置多端口多站点
1.修改 /etc/httpd/conf/httpd.conf 添加一个Listen,如: Listen 80 Listen 8001 Listen 8002 2.添加一个VirtualHost #v ...
- java设计模式——享元模式
一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1) 常常应用于系统底层的开发,以便解决系统的性能 ...
- 九九乘法表(Python实现)
a = 1 #while实现 while a: b = 1 while b: print(str(b)+'*'+str(a),end='=') print(a*b,end=' ') if b == a ...
- Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法
以User为操作对象 package com.swift.jdbc; public class User { private Long user_id; private String user_cod ...
- Python——字典
字典是一种key-value 的 数据类型,使用就想我们上学用的字典.可以通过笔画,字母来查对应页的详细内容. 特性:1. 字典是无须的.(如果光打印字典里的字符串,那么排序不会按照顺序排,因为字典是 ...
- 「译」setState如何知道它该做什么?
本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...
- PHP使用redis(一)
1,connect 描述:实例连接到一个Redis.参数:host: string,port: int返回值:BOOL 成功返回:TRUE;失败返回:FALSE <?php $redis = ...
- stark组件(11):组合搜索
效果图: 新增函数和类 Option 获取字段的对象或元组 SearchGroupRow 封装数据,展示到前端 get_search_group 获取组合搜索的字段 get_search_group_ ...