CKEditor 自定义image插件

  1. 创建image.js

(function () {

    var imageUploadId = "imageUploadId_" + new Date().getTime() + parseInt(Math.random() * 1000); // 生成唯一编号

    function init(editor) {
        return {
            title: editor.lang.image["title"],
            minWidth: 420,
            minHeight: 360,
            onShow: function () {
                var selectedImg = editor.getSelectedHtml();
                var imgSrc = $(selectedImg["$"].firstChild).attr("src");
                var imgStyle = $(selectedImg["$"].firstChild).attr("style");
                $("#" + imageUploadId + " img.previewImage").attr("src", imgSrc);
                $("#" + imageUploadId + " img.previewImage").attr("style", imgStyle);
            },
            onOk: function () {
                var previewImg = $("#" + imageUploadId + " img.previewImage");
                var previewImageSrc = previewImg.attr("src");
                var previewImageStyle = previewImg.attr("style");
                if (previewImageSrc == null || previewImageSrc == "") {
                    return;
                }
                var image = editor.document.createElement(‘img‘);
                image.setAttribute("src", previewImageSrc);
                image.setAttribute("style", previewImageStyle);
                editor.insertElement(image);

            },
            onLoad: function () {

            },
            onHide: function () {
                $("#" + imageUploadId + " img.previewImage").attr("src", "");
                $("#" + imageUploadId + " .width").val("");
                $("#" + imageUploadId + " .height").val("");
                $("#" + imageUploadId + " img.previewImage").css("width", "inherit");
                $("#" + imageUploadId + " img.previewImage").css("height", "inherit");
            },
            contents: [
                {
                    id: "info",
                    label: editor.lang.image.infoTab,
                    accessKey: "I",
                    elements: [{
                        type: "html",
                        html: "<div style=‘margin-bottom:20px‘ id=‘" + imageUploadId + "‘ >" +
                                  "<div style=‘padding-bottom:20px;‘>" +
                                      "<a class=‘uploadFile cke_dialog_ui_button cke_dialog_ui_button_ok‘ style=‘cursor: pointer;‘>上传文件</a>" +
                                      "<label style=‘margin-left:20px;‘>宽度</label><input class=‘width cke_dialog_ui_input_text‘ style=‘width:120px;‘ type=‘text‘/>px" +
                                      "<label style=‘margin-left:20px;‘>高度</label><input class=‘height cke_dialog_ui_input_text‘ style=‘width:120px;‘ type=‘text‘/>px" +
                                  "</div>" +
                                  "<img class=‘previewImage‘/>" +
                              "</div>"
                    }]
                }]
        }
    };
    CKEDITOR.dialog.add("image", function (editor) {
        return init(editor)
    });

    // 注册事件
    $("#" + imageUploadId + " .uploadFile").ysSimpleUploadFile({
        changeCallback: function (file) {
            var fileReader = new FileReader();
            fileReader.onload = function () {
                $("#" + imageUploadId + " img.previewImage").attr("src", this.result);
            };
            fileReader.readAsDataURL(file);
        }
    });

    $(document).on("keyup", "#" + imageUploadId + " .width", function (e) {
        e.stopPropagation();
        e.preventDefault();
        var val = $(this).val();
        if (isNaN(parseInt(val))) {
            return;
        }
        $("#" + imageUploadId + " img.previewImage").css("width", val);
    });

    $(document).on("keyup", "#" + imageUploadId + " .height", function (e) {
        e.stopPropagation();
        e.preventDefault();
        var val = $(this).val();
        if (isNaN(parseInt(val))) {
            return;
        }
        $("#" + imageUploadId + " img.previewImage").css("height", val);
    });

})();

2. 创建 ys_simple_file_upload.js

(function($){

    var defaultSettings = {
        acceptTypes:["jpg","png"], // 接受的上传文件类型
        changeCallback:function(file){

        } // 自定义input[type=file] change事件
    };

    var renderHtml = "<input type=‘file‘ style=‘display:none;‘/>";

    // 添加隐藏的
    function renderInputFile(target,settings){
        // 生成dialog唯一标识
        var id = "ys_simple_file_upload_"+new Date().getTime()+""+parseInt(Math.random());
        $(target).attr("ys_simple_file_upload",id);
        $(renderHtml).attr("id",id).appendTo("html"); // 添加到文档中去
        return $("#"+id);
    }

    function bindEventHandlers(container,settings){
        var changeCallback = settings.changeCallback;

        $(container).change(function(e){
            e.preventDefault();
            e.stopPropagation();
            var file = e.target.files[0];

            if(file==null){
                return;
            }

            if(!validateFileType(file,settings)){
                alert("文件类型不正确!");
                return;
            }

            changeCallback(file);

            // 清除value
            $(this).val("");
        });
    }

    // 验证文件类型
    function validateFileType(file,settings){
        var acceptTypes = settings.acceptTypes;
        var name = file.name;
        var fileSuffix = name.substr(name.lastIndexOf(".")+1);
        for(var i=0;i<acceptTypes.length;i++){
            var acceptType = acceptTypes[i];
            if(acceptType==fileSuffix){
                return true;
            }
        }
        return false;
    }

    var options = {
        ysSimpleUploadFile:function(settings) {
            var mergedSettings = {};
            $.extend(mergedSettings,defaultSettings,settings);

            var container = renderInputFile(this,mergedSettings);

            bindEventHandlers(container,mergedSettings);
            $(document).on("click",$(this)["selector"],function(e){
                e.preventDefault();
                e.stopPropagation();
                $(container).click();
            });
            //$(this).click(function(e){
            //    e.preventDefault();
            //    e.stopPropagation();
            //    $(container).click();
            //});
        }
    };
    $.fn.extend(options);
})(jQuery);

3. editor.html

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title></title>
<body>
<textarea id="editor"></textarea>

<script src="../static/dist/js/jquery-1.11.3.min.js"></script>
<script src="../static/dist/js/ckeditor.js"></script>
<script src="../static/js/ys_ui_plugin/ys_simple_file_upload.js"></script>
<script src="../static/dist/js/plugins/imageupload/dialogs/image.js"></script>

<script>
    CKEDITOR.replace( ‘editor‘);
</script>

</body>
</html>

4. 效果

时间: 2024-08-12 17:30:02

CKEditor 自定义image插件的相关文章

新版CKeditor七牛云插件修改

新版CKeditor七牛云插件修改基于,CKeditor 4.6的源码,CKeditor新版支持从word复制内容直接上传了(IE9+),所以不需要之前的imagepaste老插件了.本来打算对上传的文件名做一个修改,避免同时拖入大量文件,导致文件名相同覆盖的情况,考虑到之前使用的是:Uinx时间戳_原文件名的方式,所以默认还是不修改.很多人觉得文件名对搜索引擎排名有提权作用,其实可以说是基本没有的,所以不用纠结文件名的问题. 新版的改动 1.升级到CKeditor 4.6源码,并且保留了CKe

ansible(七)Conditionals 和 loops,自定义loops插件

ansible的Conditionals 和 loops 和salt-stack比起来真的太强大了.   salt-stack使用判断循环,好像,只能使用模板里面的判断和循环. 而ansible本身自带了适用于各种场景的判断循环插件.. 不但如此,像loops,我们还可以自己编写插件,满足我们的实际需求. 先说说Conditionals吧 Conditionals相对loops来说,简单,就一个关键字when 和咱们其他的程序语言的条件判断一个样,when 后面也是加一个bool值,或者bool

看一下自定义的插件怎么样

    publicvoid setUp() throws Exception {protectedfinal Log log = LogFactory.getLog(this.getClass());    public User currOperator;//绝大多数的时候都有登录人信息,特此创建    public BaseUserRole userRole;//登录人角色实例    public String filePathAndName = "D:\\junit.txt";

【分分钟上手weiphp插件开发】Vol.1——第一个自定义weiphp插件:MyHello

我们都知道,学习任何一门编程语言,一般来说第一个范例程序就是输出“Hello World”.从今天开始我们来学习weiphp插件开发,也从一个HelloWorld级别的插件开始讲起,因为安装好了的weiphp框架,默认安装了weiphp官方开发的HelloWorld插件,所以这里为了防止跟官方的插件冲突,我们开发的第一个自定义weiphp插件取名为MyHello,并通过这个简单的插件来讲解weiphp插件开发的整个流程.整个[分分钟上手weiphp插件开发]系列教程都是直接从创建一个新的插件开始

knockoutjs + easyui.treegrid 可编辑的自定义绑定插件【转】

目前仅支持URL的CRUD.不需要的话可以却掉相关代码,把treegrid的data直接赋值给viewModel,然后用ko提交整个data 1.支持双击编辑 2.单击Cell,自动保存编辑. 3.4个功能按钮. 插件源码: ko.bindingHandlers.etreegrid = { editing: false, editIndex: 0, init: function (element, valueAccessor, allBindings, viewModel, bindingCon

WordPress超好用自定义字段插件:Advanced Custom Fields

WordPress经常需要扩展些字段, 扩展字段一般有两种方法. 1.自己写自定义面板,优点在主题里面比较灵活,但代码写的比较麻烦,对于新手不适合. 2.使用自定义字段插件,这里推荐Advanced Custom Fields 设置和使用相当方便. 下面介绍下安装及使用方法 一.安装插件:插件搜索:Advanced Custom Fields(第一个就是) 二.安装好后点击 菜单->字段 新建字段 填写字段信息 点击发布就可以了.关于字段类型看你自己的需要,需要图片就选图片. 三.填写字段内容

自定义jQuery插件

jQuery编写插件的两种方法 1.添加jQuery对象级的插件,是给jQuery类添加方法 写法: (function($){ $.fn.extend({ "函数名":function(自定义参数){ //这里写插件代码 } }); })(jQuery); 或者 (function($){ $.fn.函数名=function(自定义参数){ //这里写插件代码 } })(jQuery); 调用方法:$("#id").函数名(参数); 2.jQuery类级别的插件,

炫酷JQUERY自定义对话框插件JDIALOG_JDIALOG弹出对话框和确认对话框插件

多种类型自定义对话框插件jDialog是一款基于jquery实现的轻量级多种类型的自定义对话框插件 在项目开发中.一般会美化 alert(); 的样式.那么今天我就和大家分享一款非常炫的插件 先来看一下程序最后的效果图片吧 下面是HTMl代码 <center> <button id="test1">alert方式调用</button> <br/><br/> <button id="test2">

自定义jQuery插件(一)

自定义jQuery插件(一) 虽然现在有大量的插件可供我们选择使用,但实际开发过程中,使用别人的插件难免会带来问题,比如 插件功能强大,代码行数也随着激增,但是我们只使用其中一小部分. 使用别人的插件,很难看懂别人的代码,特别是压缩成min.js,为后期维护,需求变更等带来很严重问题. 同样想在现有插件上做进一步开发也没那么容易. 装逼 所以学习jQuery插件开发很有必要. 自定义插件的类型 自定义插件的类型主要有两种(我猜的) 1. 类级别插件 类级别插件比较简单,通过$.extend()直