其实简单的说就是编辑框很多按钮,所有按钮的功能都是以command形式提供,所以execCommand就是执行这些功能的命令。
有些按钮是能弹出显示一个对话框,他的基类就是dialog,而所有被弹出的dialog框子都在dialogs文件夹中,也就是说逻辑就在那里面。
我们上传图片完事后会有个确认和取消的按钮,这个按钮来自于dialog基类,这个类厘米有个onok就是我们关注的内容了,点击确定了才能将文件插入到编辑框文档中嘛,所以关注它,在这个代码逻辑中确实实现了该按钮的功能,也就是上述的execCommand('inserimage'),而调头回去看整体代码all.js中,看到了insertimage功能部分,有两个事件可以被我们用editor.addListener所截获,一个是beforeinsertimage,一个是afterinsertimage,所以我们可以在我们的代码中加入这个事件来获取得到我们想要的被上传的文件地址了。

也就大功告成了!

下面详情:

3、UEditor 1.4.3.2版本单独(独立打开上传图片窗口)

/**
* Created by Web on 16/3/4.
*/

/*
资源来自:http://blog.csdn.net/yangzhihello/article/details/16975607

使用方法:
我这里没写完,主要讲一下代码原理啊,其实下面代码已经可以用了,你可以再自己改一下吧。
$('你的按钮').upload(function(list){

});

*/
(function($){
var upload = {
editor:null,
init:function(editorid,callback){
var _editor =this.getEditor(editorid);
_editor.ready(function () {

//_editor.setDisabled(); // 如果使用这个则无法获取到事件

_editor.hide();
_editor.addListener('beforeinsertimage', function (t, args) {
//$("#"+keyid).val(args[0].src);
callback(args);
console.log(t)
console.log(args)
alert(args);
});
});
},
getEditor:function(editorid){
this.editor = UE.getEditor(editorid);
return this.editor;
},
show:function(that){
var _editor = this.editor;
//注意这里只需要获取编辑器,无需渲染,如果强行渲染,在IE下可能会不兼容(切记)
//和网上一些朋友的代码不同之处就在这里
$(that).click(function(){
var image = _editor.getDialog("insertimage");
image.render();
image.open();
});
},
render:function(editorid){
var _editor = this.getEditor(editorid);
_editor.render();
}
};

/*
* 事件激发对象
* 存放图片容器
* */

$.fn.upload = function(callback){

$('#ueditor-upload').size() <= 0 && $('<script id="ueditor-upload" type="text/plain" style="display:none"></script>').appendTo('body');
upload.init("ueditor-upload",callback);
upload.show(this);
}

})(jQuery);

全部解释:

我先说一下怎么回事啊,
首先UEditor有个基类叫Dialog,你可以在ueditor.all.js(该文件将项目所有JS合并到一起了)搜到这个类,
关键词Dialog.prototype或Dialog = baidu.ed都能搜到,行数26809

你看这个基类里面有个open方法,open肯定是打开窗口呀?所以我们点那个按钮才会弹出个框么,
再看看我们的上传图片的窗口,它实际在你的UEditor下载的包中的dialogs文件夹中的image文件夹
里面有几个文件,

其中image.js就是它真实的代码逻辑了,之前1.3.6以前的版本都是用swfupload,后来用了webuploader(这是我咬牙看github上的各个版本区别的时候发现的)
确定按钮的代码在image.js中的74行,关键词:function initButtons() {

这个onok的方法就是dialog基类中的确认按钮了,我们看他干了什么。

case 'upload':
list = uploadImage.getInsertList();

var count = uploadImage.getQueueCount();
if (count) {
$('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
return false;
}
break;

他判断了个id,因为有4个选项卡么,什么插入图片、上传图片、远程图片什么的,我们关注的是上传图片,
所以看了这个case

他在上传完成后没有问题的情况下不return,否则返回false也就上传失败了,再往下看

if(list) {
editor.execCommand('insertimage', list);
remote && editor.fireEvent("catchRemoteImage");
}

如果有文件列表的话(上传成功),那么就execCommand(insertimage)了,那么这代码从来哪来的?是在ueditor.all.js中的11090行,
关键词:UE.commands['insertimage'] = {

if(me.fireEvent('beforeinsertimage', opt) === true){
return;
}
这里他有个fireEvent的beforeinsertimage,所以我们可以截获这个事件!

那么有了上述给出的代码,

_editor.addListener('beforeinsertimage', function (t, args) {
//$("#"+keyid).val(args[0].src);
callback(args);
console.log(t)
console.log(args)
alert(args);
});

然后我们就可以在这里取出那个列表值,也就是上传图片的真实路径了,那么我加了个callback,我可以在自己的页面DOM中处理完成后的事件了。

还有点其他的记录一下:

1、UEditor不用JSP使用Servlet来获取config.json

首先要弄清楚几个路径:
String rootPath = request.getServletContext().getRealPath("/");
response.getWriter().write(new ActionEnter(request, rootPath).exec());

response.getWriter().write(rootPath+request.getContextPath()+request.getRequestURI() );

第一个是rootPath,他指的是你的实际根目录所在路径
Mac/Linux : /usr/xxx/yourweb
Windows : c:/users/xxx/yourweb

第二个是你的请求路径request.getContextPath(),例如/admin/upload
第三个是其它

百度的UEditor获取config.json是用rootPath(绝对路径)+你的请求路径/admin/upload的上一层(代码中getParnet()了)
【代码所在ConfigManager.java搜this.parentPath = file.getParent();】

也就是上述的:
/usr/xxx/yourweb/admin/config.json

2、UEditor显示目录下所有图片(上传图片中的图片管理功能)

注意这里:
FileManager.java搜下面代码

public FileManager ( Map<String, Object> conf ) {

this.rootPath = (String)conf.get( "rootPath" );
this.dir = this.rootPath + (String)conf.get( "dir" );
this.allowFiles = this.getAllowFiles( conf.get("allowFiles") );
this.count = (Integer)conf.get( "count" );

}

ActionEnter.java搜下面代码

case ActionMap.LIST_FILE:
conf = configManager.getConfig( actionCode );
int start = this.getStartIndex();
state = new FileManager( conf ).listFile( start );
break;

configManager.java中的

case ActionMap.LIST_FILE:
conf.put( "allowFiles", this.getArray( "fileManagerAllowFiles" ) );
conf.put( "dir", this.jsonConfig.getString( "fileManagerListPath" ) );
conf.put( "count", this.jsonConfig.getInt( "fileManagerListSize" ) );
break;

config.json中的

"fileManagerListPath": "/uploads/files/", /* 指定要列出文件的目录 */

rootPath是绝对路径,
dir是由rootPath + dir(来自configManager.java中的从config.json获取的)拼接到一起的

所以按我的是

/usr/xxx/yourweb/uploads/files/

所以你得保证你的路径对应的上才能正常访问!!

ueditor 1.4.3.2 独立/单独 上传图片框原理的更多相关文章

  1. [转]kindeditor隐藏上传图片框网络图片或本地上传的功能

    原文地址:http://www.lingchenliang.com/post/154.html kindeditor富文本编辑器点击上传图片按钮,在弹出的窗口中去掉上传网络图片的功能,只留下本地上传, ...

  2. WebUploader UEditor chrome 点击上传文件选择框会延迟几秒才会显示 反应很慢

    chrome52.0.2743.80以上, accept: { title: 'Images', extensions: 'jpg,jpeg,png', mimeTypes: 'image/*' } ...

  3. ueditor编辑器插件 chrome中图片上传框延时问题

    最近在项目中使用ueditor插件进行文字的在线编辑功能时,发现这个插件的图片上传弹框在chrome浏览器延迟非常的厉害.经过多方搜索,终于解决.现将解决方案记录如下: 1.修改/Ueditor/di ...

  4. javascript 无刷新上传图片之原理

    刚开始我认为可以像ajax 那样获取到数据然后通过ajax 发送请求,后来发现浏览器为了客户端的安全默认并没有给javascript 这个权限.这个方法当然是行不同了.我看了好像开源的上传图片原理,当 ...

  5. 独立成分分析 ICA 原理及公式推导 示例

    独立成分分析(Independent component analysis) 前言 独立成分分析ICA是一个在多领域被应用的基础算法.ICA是一个不定问题,没有确定解,所以存在各种不同先验假定下的求解 ...

  6. Unity编辑器-创建单独编辑框,折叠框,提示框

    今天我们就来学习如何创建一个编辑框,上面绘制一个折叠框里面有四种消息框. 代码如下: using UnityEngine; using System.Collections; using UnityE ...

  7. 使用Ueditor上传图片到图片服务器(一)

    网站的文章,通过运营平台来发布文章(图文消息),上传图片等.百度Ueditor比较成熟就采用了该技术,另外上传的图片是网站系统以及运营平台系统共享的,所以考虑搭建独立的图片服务器,以后也可以提供给公司 ...

  8. 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文 ...

  9. 百度编辑器UEditor 点击上传图片选择框会延迟几秒才会显示 反应很慢(转)

    转自:http://www.blogxuan.com/php/show/323.html UEditor 编辑器点击上传文件选择框会延迟几秒才会显示,反应很慢,上传图片选择框显示很慢. 1.uedit ...

随机推荐

  1. 【动态规划】Vijos P1493 传纸条(NOIP2008提高组第三题)

    题目链接: https://vijos.org/p/1493 题目大意: 二取方格数,从(1,1)向下或向右走到(n,m)走两次,每个走到的格子值只能被取一次所能取到的最大值. (n,m<=50 ...

  2. 【动态规划】Vijos P1011 清帝之惑之顺治

    题目链接: https://vijos.org/p/1011 题目大意: 给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方.问最长能走多少格. 题目思路: ...

  3. Java---获得系统窗口的分辨率

    //获得系统屏幕分辨率 //得到当前屏幕的分辨率:Toolkit.getDafaultToolkit().getScreenSize() Toolkit t = Toolkit.getDefaultT ...

  4. NOI题库1814 恼人的青蛙

    1814:恼人的青蛙 总时间限制: 2000ms 单个测试点时间限制: 500ms 内存限制: 65536kB 描述 在韩国,有一种小的青蛙.每到晚上,这种青蛙会跳越稻田,从而踩踏稻子.农民在早上看到 ...

  5. Spring与SpringMVC的容器关系分析

    Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配置S ...

  6. Linux下多任务间通信和同步-概述

    Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...

  7. Flex3在应用RemoteObject出现问题解决方法

    出现该问题 <mx:RemoteObject id="robj" destination="hello" endpoint="http://lo ...

  8. C++中的类和对象(一)

    一,类的概念及封装 1.什么是封装 第一层含义:封装是面向对象程序设计最基本的特性.把数据(属性)和函数(方法)合成一个整体,这在计算机世界中是用类和对象实现的.(把属性和方法进行封装) 第二层含义: ...

  9. MySQL ERROR 1045错误解决办法

    今天在安装MySQL数据库时,有安装过程中报ERROR 1045错误,网上查了一下,解决方法如下: 1.对于安装过程中该错选择"skip"继续向下安装,完成安装: 2.在MySQL ...

  10. jEdit应用指南【基础篇】

    jEdit是Java编写,强大,易用的程序员文本编辑器 jEdit是一个成熟的,设计优秀的程序员文本编辑器,已经有了7年的开发历史.在功能和易用性方面压倒许多昂贵的开发工具时,jEdit在GNU公用许 ...