Extjs 3.0 htmleditor实现插入图片功能

首先感谢前辈们的无私奉献。贴出参考地址

http://zhidao.baidu.com/link?url=Q0ZM405OFNy_xAHSut9TepRJxgXCxFayQttrQz1N82dlA1_JnAb4Ojdl-b9T0AyzPNcgdHWI5h-66RUcVWLW6Mb295rWGUXJFyLw1GBrvwK

贴出效果图

按照前辈的指示。我复制代码存为了一个js文件。引入。关于之前的js代码请移步我贴出的链接。

最开始,我一字不改地复制了代码,除了修改了文件上传的url。测试,发现总是报错,并且不进入sucess也不进入failure。断点检查发现是因为服务器返回的数据格式不对,在解析成json的时候,extjs内部出错了。这里贴出一下后台关键代码仅供参考,后台我用的是asp.net:

protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["type"] != null && Request.QueryString["type"] == "newsImage")
            {
                Response.Write(InsertNewsImage());
                Response.End();
            }
        }
        private string InsertNewsImage()
        {
            string uploadPath = "D:\test";
            string downloadPath = "http://localhost/UploadFiles";
            try
            {
                string path = uploadPath + "/NewsImage/";
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                HttpPostedFile file = Request.Files[0];
                if (file == null || file.ContentLength == 0 || string.IsNullOrEmpty(file.FileName))
                {
                    return "{success:false,error:‘上传文件为空‘}";
                }
                string extName = "." + file.FileName.Substring(file.FileName.LastIndexOf(‘.‘) + 1);
                string saveName = Guid.NewGuid().ToString() + extName;
                file.SaveAs(path + "\\" + saveName);
                return "{success:true,filepath:‘" + downloadPath + "/NewsImage/" + saveName + "‘}";
            }
            catch (Exception e)
            {
                return "{success:false,error:‘" + e.Message + "‘}";
            }
        }

  注意,后台一定要返回json格式的数组,并且带一个bool类型的success返回值。其他的就可以根据自己的需要返回。

目前为止,可以上传了,也可以显示图片了。但是美中不足的是,图片如果上传太大,显示的太大太大了就,不好控制。于是我加了一个宽高限定上去。

然后这里还有个问题,大家也都会发现。就是返回后的图片总是在文本的最前面,也就是说,无法插入到之前光标在的地方,为什么呢?

于是我仔细去看前辈的方法,也仔细去找extjs 的api看看有没有记录鼠标光标的方法。最后,我看到前辈们用的这个方法

if (Ext.isIE) {
                               editor.insertAtCursor(element.outerHTML);
                           }

我去翻阅了一下insertAtCursor的方法,这个方法是这样子的:

function(b){
	if(!this.activated)
	{
		return
	}
	if(Ext.isIE)
	{
		this.win.focus();
		var a=this.doc.selection.createRange();
		if(a)
		{
			a.collapse(true);
			a.pasteHTML(b);
			this.syncValue();
			this.deferFocus()
		}
	}
	else
	{
		this.win.focus();
		this.execCmd("InsertHTML",b);
		this.deferFocus()
	}
}

  这里大家其实可以发现原因了。在插入图像之前,代码先获得文本框的焦点,在焦点处创建一个Range,这里可以理解成创建一个空元素吧,然后把后台返回的图像的html插入到这个元素里面。注意一下,这里获取焦点这个方法focus()是在上传图片之后执行的,获取焦点之后创建Range。问题就在这里了。在上传图片的时候,文本框是失去焦点的,也就是说,那个时候并不知道光标在哪个地方,因为没有焦点。所以最后总是把图片插在文字的最前面。我们只需要把获取焦点并创建Range的逻辑放在弹出上传对话框之前就好了。然后再把返回的图像路径放到Range里面。下面贴出插件全部代码!

var HTMLEditor = Ext.extend(Ext.form.HtmlEditor, {
    addImage: function() {
        var editor = this;
        editor.win.focus();
        var range = editor.doc.selection.createRange();
        var imgform = new Ext.FormPanel({
            region: ‘center‘,
            labelWidth: 55,
            frame: true,
            bodyStyle: ‘padding:5px 5px 0‘,
            autoScroll: true,
            border: false,
            fileUpload: true,
            items: [{
                xtype: ‘textfield‘,
                fieldLabel: ‘选择图片‘,
                id: ‘UserFile‘,
                name: ‘UserFile‘,
                inputType: ‘file‘,
                allowBlank: false,
                blankText: ‘文件不能为空‘,
                anchor: ‘90%‘
            }, {
                xtype: ‘textfield‘,
                fieldLabel: ‘高(像素)‘,
                id: ‘height‘,
                name: ‘height‘,
                allowBlank: false,
                regex: /^\d+$/,
                regexText: ‘请输入数字‘,
                blankText: ‘请填写图片显示的高度‘,
                anchor: ‘90%‘
            }, {
                xtype: ‘textfield‘,
                fieldLabel: ‘宽(像素)‘,
                id: ‘width‘,
                name: ‘width‘,
                allowBlank: false,
                regex: /^\d+$/,
                regexText: ‘请输入数字‘,
                blankText: ‘请填写图片显示的宽度‘,
                anchor: ‘90%‘
}],
                buttons: [{
                    text: ‘上传‘,
                    handler: function() {
                        if (!imgform.form.isValid()) { return; }
                        var formValues = imgform.form.getValues();
                        var width = formValues["width"];
                        var height = formValues["height"];
                        if (!width || !height || width == "0" || height == "0") {
                            MessageBox(‘错误‘, "请填写正确的宽度和高度");
                            return;
                        }
                        imgform.form.submit({
                            waitMsg: ‘正在上传......‘,
                            url: ‘SaveAffix.aspx?type=newsImage‘,
                            success: function(form, action) {
                                var element = document.createElement("img");
                                element.style.width = width + "px";
                                element.style.height = width + "px";
                                element.src = action.result.filepath;
                                if (Ext.isIE) {
                                    if (range) {
                                        range.collapse(true);
                                        range.pasteHTML(element.outerHTML);
                                        editor.syncValue();
                                        editor.deferFocus()
                                    }
                                } else {
                                    var selection = editor.win.getSelection();
                                    if (!selection.isCollapsed) {
                                        selection.deleteFromDocument();
                                    }
                                    selection.getRangeAt(0).insertNode(element);
                                }
                                form.reset();
                                win.close();
                            },
                            failure: function(form, action) {
                                form.reset();
                                if (action.failureType == Ext.form.Action.SERVER_INVALID)
                                    MessageBox(‘上传失败‘, action.result.error);
                            }
                        });
                    }
                }, {
                    text: ‘关闭‘,
                    handler: function() {
                        win.close(this);
                    }
}]
                })

                var win = new Ext.Window({
                    title: "上传图片",
                    width: 300,
                    height: 200,
                    modal: true,
                    border: false,
                    iconCls: "img.gif",
                    layout: "fit",
                    items: imgform

                });
                win.show();
            },
            createToolbar: function(editor) {
                HTMLEditor.superclass.createToolbar.call(this, editor);
                this.tb.insertButton(16, {
                    cls: "x-btn-icon",
                    icon: "img.gif",
                    handler: this.addImage,
                    scope: this
                });
            }
        });

使用方法:var Content = new HTMLEditor({ fieldLabel: ‘内容‘, width: 600, height: 250, value: contentValue });  

最后值得一提的是,这只是一个例子,我没有判断上传文件的类型。大家可以在前端判断也可以在后端判断返回错误提示。祝愉快。

时间: 2024-09-30 06:53:37

Extjs 3.0 htmleditor实现插入图片功能的相关文章

ExtJs4.2应用:使用ExtJs扩展组件searchfield实现数据搜索功能

ExtJs4.2应用:使用ExtJs扩展组件searchfield 实现数据搜索功能 1.引入searchfield组件 在Ext目录下放入ux目录将searchfield组件放入ux目录下的form文件下,如图所示: 2.在对应Js文件中引入searchfield组件 dockedItems: [{ dock: 'top', /**在顶部显示*/ xtype: 'toolbar', /**以工具栏形式展示*/ items: { width: "25%", fieldLabel: 'L

MVC 生成PDf表格并插入图片

最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片.对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种. iTextSharp组件 使用方法. 1,引入itextsharp.dll 2,  引入命名空间 ? 1 2 3 using iTextSharp; using iTextSharp.text; using iTextSharp.text.pdf; ? 1 2 3 4 5 6 7 8 9 10 11 12     D

POI插入图片至Excel使用固定的长宽

使用POI在Excel里插入图片,如何使插入的图片使用固定的大小?先介绍原有的两种方式: 一种是指定开始和结尾单元格,然后从头画到尾,相当于平铺 还有一种就是仅指定开始的单元格,图片的大小跟这个单元格的长宽有关,可以放大缩小固定的倍数,相当于左对齐 第一种效果如下: 第二种效果如下: 第一种方法的关键代码如下: 1 private void pictureToSheet(Sheet finalSheet, Row row, Cell cell, int pictureIdx) { 2 Drawi

iframe从光标处插入图片(失去焦点后仍然可以在原位置插入)

转载请注明: TheViper http://www.cnblogs.com/TheViper  为什么会有这个需求? 当我们需要一个文本输入框(编辑器),它的功能定位介于专门的富文本编辑器和裸(原生)文本框之间.这时,如果用专门富文本编辑器,如kindeditor,ueditor,显的很大材小用,而且这两个的体积都不小,而体积小的富文本编辑器又是针对现代浏览器的. 贴吧发帖和知乎发问题的编辑器就是典型的这种需求 问题的出现 下面是这个问题的呈现,ie8下,知乎编辑器中插入图片 首先将光标移到已

C#中如何创建PDF网格并插入图片

这篇文章我将向大家演示如何以编程的方式在PDF文档中创建一个网格,并将图片插入特定的网格中. 网上有一些类似的解决方法,在这里我选择了一个免费版的PDF组件.安装控件后,创建新项目,添加安装目录下的dll文件作为项目的引用以及命名空间,如下: using Spire.Pdf; using Spire.Pdf.Graphics; using Spire.Pdf.Grid; 接下来是详细步骤及代码片段: 步骤1: 首先创建一个PDF文档,并添加一个新页面. PdfDocument doc = new

C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容

序 在前面的文章C# 如何插入.修改.删除Word批注一文中介绍了如何操作Word批注的一些方法,在本篇文章中将继续介绍操作Word批注的方法.分以下三种情况来介绍: 插入图片到Word批注 读取Word批注 回复Word批注 所需工具 Spire.Doc for .NET 6.3(社区版) Visual Stuido 示例代码 1. 插入图片到Word批注 [C#] using Spire.Doc; using Spire.Doc.Documents; using Spire.Doc.Fiel

Markdown 中快速插入图片的处理方式

Markdown 中快速插入图片的处理方式 选项 : Marxico 同步 evernote 账号, 然后在Marxico 中插入数据 适用于evernote 重度使用者,但以前Marxico sync to evernote 的免费的功能,现在需要付费 vscode 插件(推荐) paste image to aliyun paste image to qiniu (推荐) 在试验 paste image to qiniu 的时候,发现提示 发现 https://github.com/fave

xhEditor实现插入代码功能

如果大家经常使用CSDN或者其他技术博客,都会有插入程序代码或脚本功能 开源中国 CSDN 这里介绍xhEditor实现插入代码功能,对xhEditor进行插件扩展 一.首先定义插件样式 <style type="text/css"> /* 增加插入代码工具图标 */ .btnCode { background: transparent url(img/code.png) no-repeat 0px 0px; background-position: 3px -2px; }

Java Excel 插入图片

在POI中有HSSFPatriarch对象,该对象为画图的顶级管理器,它的createPicture(anchor, pictureIndex)方法就能够在Excel插入一张图片.所以要在Excel中插入图片,三步就可以搞定. 一.获取HSSFPatriarch对象, 二.new HSSFClientAnchor对象, 三.调用createPicture方法即可. 实现倒是非常容易实现,如果想把它做好还是有点儿难度的.这里我们先插入一张图片: public class ExcelImageTes