关于移动手机端富文本编辑器qeditor图片上传改造
日前项目需要在移动端增加富文本编辑,上网找了下,大多数都是针对pc版的,不太兼容手机,当然由于手机屏幕小等原因也限制富文本编辑器的众多强大功能,所以要找的编辑器功能必须是精简的。
找了好久,发现qeditor比较精简,操作简单,唯一缺点是上传图片时只能填写url,不能直接从手机上传。
针对这点,自己决定动手修改。
修改思路:
1、创建文件上传输入框
2、点击编辑器上传图片按钮时,触发文件输入框点击事件
3、选择图片后异步上传至服务器,返回图片路径
4、编辑器插入img标签,显示图片
以下是修改过程:
上图了解下原来是怎么样的,这个是qeditor的界面,qeditor的样式可以自己修改:

点击上传图片按钮后是弹框要求输入图片url的 :

以下是改造后的效果,点击图片上传按钮显示的是现在手机相册图片 :

选择后上传图片:

qeditor的代码只有200多行,相当简洁,以下是原始代码:
// Generated by CoffeeScript 1.6.3
/*
jquery.qeditor
============== This is a simple WYSIWYG editor with jQuery. ## Author: Jason Lee <huacnlee@gmail.com> ## Requirements: [jQuery](http://jquery.com)
(Font-Awesome)[http://fortawesome.github.io/Font-Awesome/] - Toolbar icons ## Usage: $("textarea").qeditor(); and then you need filt the html tags,attributes in you content page.
In Rails application, you can use like this: <%= sanitize(@post.body,:tags => %w(strong b i u strike ol ul li address blockquote pre code br div p), :attributes => %w(src)) %>
*/ var QEDITOR_ALLOW_TAGS_ON_PASTE, QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE, QEDITOR_TOOLBAR_HTML; QEDITOR_TOOLBAR_HTML = "<div class=\"qeditor_toolbar\">\n <a href=\"#\" data-action=\"bold\" class=\"qe-bold\"><span class=\"fa fa-bold\" title=\"Bold\"></span></a> \n <a href=\"#\" data-action=\"italic\" class=\"qe-italic\"><span class=\"fa fa-italic\" title=\"Italic\"></span></a> \n <a href=\"#\" data-action=\"underline\" class=\"qe-underline\"><span class=\"fa fa-underline\" title=\"Underline\"></span></a> \n <a href=\"#\" data-action=\"strikethrough\" class=\"qe-strikethrough\"><span class=\"fa fa-strikethrough\" title=\"Strike-through\"></span></a> \n <span class=\"vline\"></span>\n <span class=\"qe-icon qe-heading\">\n <ul class=\"qe-menu\">\n <li><a href=\"#\" data-name=\"h1\" class=\"qe-h1\">Heading 1</a></li>\n <li><a href=\"#\" data-name=\"h2\" class=\"qe-h2\">Heading 2</a></li>\n <li><a href=\"#\" data-name=\"h3\" class=\"qe-h3\">Heading 3</a></li>\n <li><a href=\"#\" data-name=\"h4\" class=\"qe-h4\">Heading 4</a></li>\n <li><a href=\"#\" data-name=\"h5\" class=\"qe-h5\">Heading 5</a></li>\n <li><a href=\"#\" data-name=\"h6\" class=\"qe-h6\">Heading 6</a></li>\n <li class=\"qe-hline\"></li>\n <li><a href=\"#\" data-name=\"p\" class=\"qe-p\">Paragraph</a></li>\n </ul>\n <span class=\"icon fa fa-font\"></span>\n </span>\n <span class=\"vline\"></span>\n <a href=\"#\" data-action=\"insertorderedlist\" class=\"qe-ol\"><span class=\"fa fa-list-ol\" title=\"Insert Ordered-list\"></span></a> \n <a href=\"#\" data-action=\"insertunorderedlist\" class=\"qe-ul\"><span class=\"fa fa-list-ul\" title=\"Insert Unordered-list\"></span></a> \n <a href=\"#\" data-action=\"indent\" class=\"qe-indent\"><span class=\"fa fa-indent\" title=\"Indent\"></span></a> \n <a href=\"#\" data-action=\"outdent\" class=\"qe-outdent\"><span class=\"fa fa-outdent\" title=\"Outdent\"></span></a> \n <span class=\"vline\"></span> \n <a href=\"#\" data-action=\"insertHorizontalRule\" class=\"qe-hr\"><span class=\"fa fa-minus\" title=\"Insert Horizontal Rule\"></span></a> \n <a href=\"#\" data-action=\"blockquote\" class=\"qe-blockquote\"><span class=\"fa fa-quote-left\" title=\"Blockquote\"></span></a> \n <a href=\"#\" data-action=\"pre\" class=\"qe-pre\"><span class=\"fa fa-code\" title=\"Pre\"></span></a> \n <a href=\"#\" data-action=\"createLink\" class=\"qe-link\"><span class=\"fa fa-link\" title=\"Create Link\" title=\"Create Link\"></span></a> \n <a href=\"#\" data-action=\"insertimage\" class=\"qe-image\"><span class=\"fa fa-picture-o\" title=\"Insert Image\"></span></a> \n <a href=\"#\" onclick=\"return QEditor.toggleFullScreen(this);\" class=\"qe-fullscreen pull-right\"><span class=\"fa fa-arrows-alt\" title=\"Toggle Fullscreen\"></span></a> \n</div>"; QEDITOR_ALLOW_TAGS_ON_PASTE = "div,p,ul,ol,li,hr,br,b,strong,i,em,img,h2,h3,h4,h5,h6,h7"; QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE = ["style", "class", "id", "name", "width", "height"]; window.QEditor = {
actions: ['bold', 'italic', 'underline', 'strikethrough', 'insertunorderedlist', 'insertorderedlist', 'blockquote', 'pre'],
action: function(el, a, p) {
var editor;
editor = $(".qeditor_preview", $(el).parent().parent());
editor.find(".qeditor_placeholder").remove();
editor.focus();
if (p === null) {
p = false;
}
if (a === "blockquote" || a === "pre") {
p = a;
a = "formatBlock";
}
if (a === "createLink") {
p = prompt("Type URL:");
if (p.trim().length === 0) {
return false;
}
} else if (a === "insertimage") {
p = prompt("Image URL:");
if (p.trim().length === 0) {
return false;
}
}
if (QEditor.state(a)) {
document.execCommand(a, false, null);
} else {
document.execCommand(a, false, p);
}
QEditor.checkSectionState(editor);
editor.change();
return false;
},
state: function(action) {
return document.queryCommandState(action) === true;
},
prompt: function(title) {
var val;
val = prompt(title);
if (val) {
return val;
} else {
return false;
}
},
toggleFullScreen: function(el) {
var border;
border = $(el).parent().parent();
if (border.data("qe-fullscreen") === "1") {
QEditor.exitFullScreen();
} else {
QEditor.enterFullScreen(border);
}
return false;
},
enterFullScreen: function(border) {
border.data("qe-fullscreen", "1").addClass("qeditor_fullscreen");
border.find(".qeditor_preview").focus();
return border.find(".qe-fullscreen span").attr("class", "fa fa-compress");
},
exitFullScreen: function() {
return $(".qeditor_border").removeClass("qeditor_fullscreen").data("qe-fullscreen", "0").find(".qe-fullscreen span").attr("class", "fa fa-arrows-alt");
},
getCurrentContainerNode: function() {
var containerNode, node;
if (window.getSelection) {
node = window.getSelection().anchorNode;
containerNode = node.nodeType === 3 ? node.parentNode : node;
}
return containerNode;
},
checkSectionState: function(editor) {
var a, link, _i, _len, _ref, _results;
_ref = QEditor.actions;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
a = _ref[_i];
link = editor.parent().find(".qeditor_toolbar a[data-action=" + a + "]");
if (QEditor.state(a)) {
_results.push(link.addClass("qe-state-on"));
} else {
_results.push(link.removeClass("qe-state-on"));
}
}
return _results;
},
version: function() {
return "0.2.0";
}
}; (function($) {
return $.fn.qeditor = function(options) {
return this.each(function() {
var currentVal, editor, obj, placeholder, qe_heading, toolbar;
obj = $(this);
obj.addClass("qeditor");
editor = $('<div class="qeditor_preview clearfix" contentEditable="true"></div>');
placeholder = $('<div class="qeditor_placeholder"></div>');
$(document).keyup(function(e) {
if (e.keyCode === 27) {
return QEditor.exitFullScreen();
}
});
document.execCommand('defaultParagraphSeparator', false, 'p');
currentVal = obj.val();
editor.html(currentVal);
editor.addClass(obj.attr("class"));
obj.after(editor);
placeholder.text(obj.attr("placeholder"));
editor.attr("placeholder", obj.attr("placeholder") || "");
editor.append(placeholder);
editor.focusin(function() {
QEditor.checkSectionState(editor);
return $(this).find(".qeditor_placeholder").remove();
});
editor.blur(function() {
var t;
t = $(this);
QEditor.checkSectionState(editor);
if (t.html().length === 0 || t.html() === "<br>" || t.html() === "<p></p>") {
return $(this).html('<div class="qeditor_placeholder">' + $(this).attr("placeholder") + '</div>');
}
});
editor.change(function() {
var pobj, t;
pobj = $(this);
t = pobj.parent().find('.qeditor');
return t.val(pobj.html());
});
editor.on("paste", function() {
var txt;
txt = $(this);
return setTimeout(function() {
var attrName, els, _i, _len;
els = txt.find("*");
for (_i = 0, _len = QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE.length; _i < _len; _i++) {
attrName = QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE[_i];
els.removeAttr(attrName);
}
els.find(":not(" + QEDITOR_ALLOW_TAGS_ON_PASTE + ")").contents().unwrap();
txt.change();
return true;
}, 100);
});
editor.keyup(function(e) {
QEditor.checkSectionState(editor);
return $(this).change();
});
editor.on("click", function(e) {
QEditor.checkSectionState(editor);
return e.stopPropagation();
});
editor.keydown(function(e) {
var node, nodeName;
node = QEditor.getCurrentContainerNode();
nodeName = "";
if (node && node.nodeName) {
nodeName = node.nodeName.toLowerCase();
}
if (e.keyCode === 13 && !(e.shiftKey || e.ctrlKey)) {
if (nodeName === "blockquote" || nodeName === "pre") {
e.stopPropagation();
document.execCommand('InsertParagraph', false);
document.execCommand("formatBlock", false, "p");
document.execCommand('outdent', false);
return false;
}
}
});
obj.hide();
obj.wrap('<div class="qeditor_border"></div>');
obj.after(editor);
toolbar = $(QEDITOR_TOOLBAR_HTML);
qe_heading = toolbar.find(".qe-heading");
qe_heading.mouseenter(function() {
$(this).addClass("hover");
return $(this).find(".qe-menu").show();
});
qe_heading.mouseleave(function() {
$(this).removeClass("hover");
return $(this).find(".qe-menu").hide();
});
toolbar.find(".qe-heading .qe-menu a").click(function() {
var link;
link = $(this);
link.parent().parent().hide();
QEditor.action(this, "formatBlock", link.data("name"));
return false;
});
toolbar.find("a[data-action]").click(function() {
return QEditor.action(this, $(this).attr("data-action"));
});
return editor.before(toolbar);
});
};
})(jQuery);
修改完成后的代码:
// Generated by CoffeeScript 1.6.3
/*
jquery.qeditor
============== This is a simple WYSIWYG editor with jQuery. ## Author: Jason Lee <huacnlee@gmail.com> ## Requirements: [jQuery](http://jquery.com)
(Font-Awesome)[http://fortawesome.github.io/Font-Awesome/] - Toolbar icons ## Usage: $("textarea").qeditor(); and then you need filt the html tags,attributes in you content page.
In Rails application, you can use like this: <%= sanitize(@post.body,:tags => %w(strong b i u strike ol ul li address blockquote pre code br div p), :attributes => %w(src)) %>
*/ var QEDITOR_ALLOW_TAGS_ON_PASTE, QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE, QEDITOR_TOOLBAR_HTML; QEDITOR_TOOLBAR_HTML = "<div class=\"qeditor_toolbar\">\n <a href=\"#\" data-action=\"bold\" class=\"qe-bold\"><span class=\"fa fa-bold\" title=\"Bold\"></span></a> \n <a href=\"#\" data-action=\"italic\" class=\"qe-italic\"><span class=\"fa fa-italic\" title=\"Italic\"></span></a> \n <a href=\"#\" data-action=\"underline\" class=\"qe-underline\"><span class=\"fa fa-underline\" title=\"Underline\"></span></a> \n <a href=\"#\" data-action=\"strikethrough\" class=\"qe-strikethrough\"><span class=\"fa fa-strikethrough\" title=\"Strike-through\"></span></a> \n <span class=\"vline\"></span>\n <span class=\"qe-icon qe-heading\">\n <ul class=\"qe-menu\">\n <li><a href=\"#\" data-name=\"h1\" class=\"qe-h1\">Heading 1</a></li>\n <li><a href=\"#\" data-name=\"h2\" class=\"qe-h2\">Heading 2</a></li>\n <li><a href=\"#\" data-name=\"h3\" class=\"qe-h3\">Heading 3</a></li>\n <li><a href=\"#\" data-name=\"h4\" class=\"qe-h4\">Heading 4</a></li>\n <li><a href=\"#\" data-name=\"h5\" class=\"qe-h5\">Heading 5</a></li>\n <li><a href=\"#\" data-name=\"h6\" class=\"qe-h6\">Heading 6</a></li>\n <li class=\"qe-hline\"></li>\n <li><a href=\"#\" data-name=\"p\" class=\"qe-p\">Paragraph</a></li>\n </ul>\n <span class=\"icon fa fa-font\"></span>\n </span>\n <span class=\"vline\"></span>\n <a href=\"#\" data-action=\"insertorderedlist\" class=\"qe-ol\"><span class=\"fa fa-list-ol\" title=\"Insert Ordered-list\"></span></a> \n <a href=\"#\" data-action=\"insertunorderedlist\" class=\"qe-ul\"><span class=\"fa fa-list-ul\" title=\"Insert Unordered-list\"></span></a> \n <a href=\"#\" data-action=\"indent\" class=\"qe-indent\"><span class=\"fa fa-indent\" title=\"Indent\"></span></a> \n <a href=\"#\" data-action=\"outdent\" class=\"qe-outdent\"><span class=\"fa fa-outdent\" title=\"Outdent\"></span></a> \n <span class=\"vline\"></span> \n <a href=\"#\" data-action=\"insertHorizontalRule\" class=\"qe-hr\"><span class=\"fa fa-minus\" title=\"Insert Horizontal Rule\"></span></a> \n <a href=\"#\" data-action=\"blockquote\" class=\"qe-blockquote\"><span class=\"fa fa-quote-left\" title=\"Blockquote\"></span></a> \n <a href=\"#\" data-action=\"pre\" class=\"qe-pre\"><span class=\"fa fa-code\" title=\"Pre\"></span></a> \n <a href=\"#\" data-action=\"createLink\" class=\"qe-link\"><span class=\"fa fa-link\" title=\"Create Link\" title=\"Create Link\"></span></a> \n <a href=\"#\" data-action=\"insertimage\" class=\"qe-image\"><span class=\"fa fa-picture-o\" title=\"Insert Image\"></span></a> \n <a href=\"#\" onclick=\"return QEditor.toggleFullScreen(this);\" class=\"qe-fullscreen pull-right\"><span class=\"fa fa-arrows-alt\" title=\"Toggle Fullscreen\"></span></a> \n</div>"; QEDITOR_ALLOW_TAGS_ON_PASTE = "div,p,ul,ol,li,hr,br,b,strong,i,em,img,h2,h3,h4,h5,h6,h7"; QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE = ["style", "class", "id", "name", "width", "height"]; window.QEditor = {
actions: ['bold', 'italic', 'underline', 'strikethrough', 'insertunorderedlist', 'insertorderedlist', 'blockquote', 'pre'],
action: function(el, a, p) {
var editor;
editor = $(".qeditor_preview", $(el).parent().parent());
editor.find(".qeditor_placeholder").remove();
editor.focus();
if (p === null) {
p = false;
}
if (a === "blockquote" || a === "pre") {
p = a;
a = "formatBlock";
}
if (a === "createLink") {
p = prompt("Type URL:");
if (p.trim().length === 0) {
return false;
}
} else if (a === "insertimage") {
//p = prompt("Image URL:");
//TODO
var input;
if(document.getElementById('inImgId')){
input = document.getElementById('inImgId');
}else{
input = document.createElement('input');
input.setAttribute('id', 'inImgId');
input.setAttribute('type', 'file');
input.setAttribute('name', 'file');
input.setAttribute('accept', 'image/gif, image/jpeg, image/jpg, image/png');
document.body.appendChild(input);
input.style.display = 'none';
}
input.click();
input.onchange = function(){
if(!input.value){return;}
var fd = new FormData();
var file;
file = input.files[0];
fd.append('file', file);
$.ajax({
url : window.location.protocol + '//' + window.location.host + '/weixin/uploadArticlePic',
data : fd,
processData : false,
contentType : false,
enctype : 'multipart/form-data',
type : 'POST',
success : function(data) {
var json = JSON.parse(data);
if (json.success) {
QEditor.imageChange(json.data);
} else {
alert(json.message);
}
}
});
}
if (p == null || p.trim().length === 0) {
return false;
}
}
if (QEditor.state(a)) {
document.execCommand(a, false, null);
} else {
document.execCommand(a, false, p);
}
QEditor.checkSectionState(editor);
editor.change();
return false;
},
state: function(action) {
return document.queryCommandState(action) === true;
},
prompt: function(title) {
var val;
val = prompt(title);
if (val) {
return val;
} else {
return false;
}
},
toggleFullScreen: function(el) {
var border;
border = $(el).parent().parent();
if (border.data("qe-fullscreen") === "1") {
QEditor.exitFullScreen();
} else {
QEditor.enterFullScreen(border);
}
return false;
},
enterFullScreen: function(border) {
border.data("qe-fullscreen", "1").addClass("qeditor_fullscreen");
border.find(".qeditor_preview").focus();
return border.find(".qe-fullscreen span").attr("class", "fa fa-compress");
},
exitFullScreen: function() {
return $(".qeditor_border").removeClass("qeditor_fullscreen").data("qe-fullscreen", "0").find(".qe-fullscreen span").attr("class", "fa fa-arrows-alt");
},
getCurrentContainerNode: function() {
var containerNode, node;
if (window.getSelection) {
node = window.getSelection().anchorNode;
containerNode = node.nodeType === 3 ? node.parentNode : node;
}
return containerNode;
},
checkSectionState: function(editor) {
var a, link, _i, _len, _ref, _results;
_ref = QEditor.actions;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
a = _ref[_i];
link = editor.parent().find(".qeditor_toolbar a[data-action=" + a + "]");
if (QEditor.state(a)) {
_results.push(link.addClass("qe-state-on"));
} else {
_results.push(link.removeClass("qe-state-on"));
}
}
return _results;
},
imageChange: function(imgUrl) {
var editor = $(".qeditor_preview", $(".qeditor_border"));
editor.focus();
document.execCommand("insertimage", false, imgUrl);
QEditor.checkSectionState(editor);
editor.change();
},
version: function() {
return "0.2.0";
}
}; (function($) {
return $.fn.qeditor = function(params) {
// 控制上传图片按钮显示与否 Add by C.Q 20160803
var defaults = {
showImage: true // true:显示上传图片按钮;false:不显示
};
params = $.extend({}, defaults, params);
return this.each(function() {
var currentVal, editor, obj, placeholder, qe_heading, toolbar;
obj = $(this);
obj.addClass("qeditor");
editor = $('<div class="qeditor_preview clearfix" contentEditable="true"></div>');
placeholder = $('<div class="qeditor_placeholder"></div>');
$(document).keyup(function(e) {
if (e.keyCode === 27) {
return QEditor.exitFullScreen();
}
});
document.execCommand('defaultParagraphSeparator', false, 'p');
currentVal = obj.val();
editor.html(currentVal);
editor.addClass(obj.attr("class"));
obj.after(editor);
placeholder.text(obj.attr("placeholder"));
editor.attr("placeholder", obj.attr("placeholder") || "");
editor.append(placeholder);
editor.focusin(function() {
QEditor.checkSectionState(editor);
return $(this).find(".qeditor_placeholder").remove();
});
editor.blur(function() {
var t;
t = $(this);
QEditor.checkSectionState(editor);
if (t.html().length === 0 || t.html() === "<br>" || t.html() === "<p></p>") {
return $(this).html('<div class="qeditor_placeholder">' + $(this).attr("placeholder") + '</div>');
}
});
editor.change(function() {
var pobj, t;
pobj = $(this);
t = pobj.parent().find('.qeditor');
return t.val(pobj.html());
});
editor.on("paste", function() {
var txt;
txt = $(this);
return setTimeout(function() {
var attrName, els, _i, _len;
els = txt.find("*");
for (_i = 0, _len = QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE.length; _i < _len; _i++) {
attrName = QEDITOR_DISABLE_ATTRIBUTES_ON_PASTE[_i];
els.removeAttr(attrName);
}
els.find(":not(" + QEDITOR_ALLOW_TAGS_ON_PASTE + ")").contents().unwrap();
txt.change();
return true;
}, 100);
});
editor.keyup(function(e) {
QEditor.checkSectionState(editor);
return $(this).change();
});
editor.on("click", function(e) {
QEditor.checkSectionState(editor);
return e.stopPropagation();
});
editor.keydown(function(e) {
var node, nodeName;
node = QEditor.getCurrentContainerNode();
nodeName = "";
if (node && node.nodeName) {
nodeName = node.nodeName.toLowerCase();
}
if (e.keyCode === 13 && !(e.shiftKey || e.ctrlKey)) {
if (nodeName === "blockquote" || nodeName === "pre") {
e.stopPropagation();
document.execCommand('InsertParagraph', false);
document.execCommand("formatBlock", false, "p");
document.execCommand('outdent', false);
return false;
}
}
});
obj.hide();
obj.wrap('<div class="qeditor_border"></div>');
obj.after(editor);
// 控制图片显示与否 Add by C.Q 20160803
if (params.showImage == false) {
QEDITOR_TOOLBAR_HTML = QEDITOR_TOOLBAR_HTML.replace('<a href="#" data-action="insertimage" class="qe-image"><span class="fa fa-picture-o" title="Insert Image"></span></a>', "");
}
toolbar = $(QEDITOR_TOOLBAR_HTML);
qe_heading = toolbar.find(".qe-heading");
qe_heading.mouseenter(function() {
$(this).addClass("hover");
return $(this).find(".qe-menu").show();
});
qe_heading.mouseleave(function() {
$(this).removeClass("hover");
return $(this).find(".qe-menu").hide();
});
toolbar.find(".qe-heading .qe-menu a").click(function() {
var link;
link = $(this);
link.parent().parent().hide();
QEditor.action(this, "formatBlock", link.data("name"));
return false;
});
toolbar.find("a[data-action]").click(function() {
return QEditor.action(this, $(this).attr("data-action"));
});
return editor.before(toolbar);
});
};
})(jQuery);
在这里我就不解读其它的代码功能了,主要讲解下修改部分:
1、在window.QEditor的action方法中有一处判断是否点击图片上传按钮的
else if (a === "insertimage") {
p = prompt("Image URL:");
if (p.trim().length === 0) {
return false;
}
}
从这里入手,根据思路进行相应改造
else if (a === "insertimage") {
//p = prompt("Image URL:");
var input;
if(document.getElementById('inImgId')){
input = document.getElementById('inImgId');
}else{
input = document.createElement('input');
input.setAttribute('id', 'inImgId');
input.setAttribute('type', 'file');
input.setAttribute('name', 'file');
input.setAttribute('accept', 'image/gif, image/jpeg, image/jpg, image/png');
document.body.appendChild(input);
input.style.display = 'none';
}
input.click();
input.onchange = function(){
if(!input.value){return;}
var fd = new FormData();
var file;
file = input.files[0];
fd.append('file', file);
$.ajax({
url : window.location.protocol + '//' + window.location.host + '/weixin/uploadArticlePic',
data : fd,
processData : false,
contentType : false,
enctype : 'multipart/form-data',
type : 'POST',
success : function(data) {
var json = JSON.parse(data);
if (json.success) {
QEditor.imageChange(json.data);
} else {
alert(json.message);
}
}
});
}
if (p == null || p.trim().length === 0) {
return false;
}
}
注意到代码中上传图片成功后执行的 QEditor.imageChange(json.data)方法。
这是我加上去的,目的是使编辑器插入图片,并改变编辑器的值(注意qeditor是由textarea和预览div组成,插入图片是插入到预览div中,并不存在textarea中,而取值却是从textarea中取,所以原作者以增加change()方法解决此问题,本人加入的QEditor.imageChange(json.data)同样是为解决这个问题)
imageChange: function(imgUrl) {
var editor = $(".qeditor_preview", $(".qeditor_border"));
editor.focus();
document.execCommand("insertimage", false, imgUrl);
QEditor.checkSectionState(editor);
editor.change();
}
至此修改完毕。
经测试。。。。
出现各种各样问题。。。。。图片旋转的、ip4拍照闪退、图片过大等。。。
后续优化:
1、加入图片压缩,减少服务器带宽压力
2、解决图片旋转问题
3、加入进度条
4、等
关于移动手机端富文本编辑器qeditor图片上传改造的更多相关文章
- uedit富文本编辑器及图片上传控件
微力后台 uedit富文本编辑器及文件上传控件的使用,无时间整理,暂略,参考本地代码.能跑起来.
- 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)
我们的富文本编辑器不能没有图片上传尤其是截图上传,下面我来教大家怎么实现MarkDown富文本编辑器截图上传和图片上传. 1.配置编辑器到html页 <div id="test-edi ...
- 改造百度UMeditor(UEditor-min)富文本编辑器的图片上传功能
最近项目需要新增一个发布文章的模块,用的是百度的Ueditor富文本编辑器. 公司用的是阿里云的图片服务器,需要直接把文章中图片上传到服务器上,但是这个编辑器的上传图片是直接上传到Tomcat的根目录 ...
- wysiwyg 富文本编辑器(附带图片上传功能)
Fist: 需要的文件 font 文件夹下面的也是需要的哟 Then: 引入文件 <link href="bootstrap/css/bootstrap.css" rel=& ...
- Asp.Net Core中配置使用Kindeditor富文本编辑器实现图片上传和截图上传及文件管理和上传(开源代码.net core3.0)
KindEditor使用JavaScript编写,可以无缝的于Java..NET.PHP.ASP等程序接合. KindEditor非常适合在CMS.商城.论坛.博客.Wiki.电子邮件等互联网应用上使 ...
- vue-quill-editor + iview 实现富文本编辑器及图片上传
1.npm 安装 vue-quill-editor npm install vue-quill-editor 2.再main.js中引入 import VueQuillEditor from 'vue ...
- UEditor富文本编辑器的图片上传 http://fex.baidu.com/ueditor/#server-deploy
http://fex.baidu.com/ueditor/#server-deploy http://fex.baidu.com/ueditor/#server-path 首先 editor配置文件中 ...
- 富文本vue-quill-editor修改图片上传方法
富文本vue-quill-editor修改图片上传方法 HTML 代码 HTML codes <!-- 上传的组件 --> <upload style="display:n ...
- Django之富文本编辑器kindeditor 及上传
1.什么是富文本编辑器 百度百科(https://baike.baidu.com/item/%E5%AF%8C%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8 ...
随机推荐
- Away3D 的实体收集器流程2
带着上次的疑问我们继续探讨Away3D 的渲染流程. 在Away3D中所有的显示对象都是继承Object3D 的我们先看看显示对象和继承关系. Object3D |---ObjectContainer ...
- C#多线程(下) 分类: C# 线程 2015-03-09 10:41 153人阅读 评论(0) 收藏
四.多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线 ...
- 【Android - 框架】之ButterKnife的使用
ButterKnife可以省去控件findViewById的步骤,提高开发效率. 用法: 1.添加依赖: compile 'com.jakewharton:butterknife:5.1.1' 2.在 ...
- 使用JUnit测试java代码
Junit 单元测试实验报告 一.实验环境 MyEclipse2014.Junit4.10 二.实验目的 学会单元测试,在MyEclipse中进行Junit测试 三.实验步骤 1.写出要测试的类 代 ...
- Qt 学习之路:深入 Qt5 信号槽新语法
在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号槽新语法.由于这次改动很大,许多以前看起来不是问题的问题接踵而来,因此,我们用单独的一章重新介绍一些 Qt 5 的信号槽新语 ...
- Servlet 过滤器
一.过滤器介绍 在Servlet 2.3中定义了过滤器,它能够对Servlet容器的请求和响应进行检查和修改. Servlet过滤器能够在Servlet被调用之前检查Request对象,并修改Requ ...
- unity介绍
- Python:构建缓冲带提取区域平均坡度
前一段时间做提取坡度的问题,当时首先想到的是使用ArcEngine来做,因为记得有ITopoOperator接口可以构建缓冲带,用IExtractionRaster可以掩膜栅格数据,利用IPixelB ...
- PHP 5.6启动失败failed to open configuration file '/usr/local/php/etc/php-fpm.conf'
PHP编译安装完毕,启动失败,提示 [-Jun- ::] ERROR: failed to open configuration ) [-Jun- ::] ERROR: failed to load ...
- insert当 sql语句里面有变量 为字符类型的时候 要3个单引号
set @InsertStr='INSERT INTO [dbo].[T_SchoolPercentMonth]([SchoolID],[MonthOfYear],[PercentNum]) VALU ...