企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
####注意 **开发插件过程中,会用到编辑器提供的API,也需要了解编辑器的对象结构。这些请参见『插件开发 - 对象结构』、『插件开发 - 常用API - 全局API』、『插件开发 - 常用API - 对象API』** ------ ####如何引用到页面 将插件代码写到一个独立的js文件中,例如命名为`plugin.js`,编写完成后,要这样引用到页面中。 ```html <div id="div1"> <p>请输入内容...</p> </div> <script type="text/javascript" src="../dist/js/lib/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="../dist/js/wangEditor.min.js"></script> <!--注意,plugin.js 要引用在 wangEditor.min.js 之后--> <script type="text/javascript" src="../dist/js/plugin.js"></script> <script type="text/javascript"> var editor = new wangEditor('div1'); editor.create(); </script> ``` ---- ####编写 `plugin.js` 做一个demo 在`plugin.js`中编写代码,做一个demo:点击编辑区域的图片时,弹出该图片的`url`。代码如下: ```js (function () { // 获取 wangEditor 构造函数和 jquery var E = window.wangEditor; var $ = window.jQuery; // 通过 E.plugin 注入插件代码 E.plugin(function () { // 此处的 this 指向 editor 对象本身 var editor = this; var $txt = editor.$txt; $txt.on('click', 'img', function (e) { var $img = $(e.currentTarget); alert($img.attr('src')); }); }); })(); ``` ----------- ####实际案例 wangEditor编辑器本身的许多功能都是使用插件机制开发的,例如图片、表格的toolbar ![](https://box.kancloud.cn/2016-02-05_56b460d9da677.png) 这个插件的代码,可以在`wangEditor.js`中搜索 `// 编辑器区域 table toolbar` 来找到源码。 目前该插件的源码如下(**以搜索到的源码为准**) ```js // 编辑器区域 table toolbar (function () { // 获取 wangEditor 构造函数和 jquery var E = window.wangEditor; var $ = window.jQuery; E.plugin(function () { var editor = this; var txt = editor.txt; var $txt = txt.$txt; var $currentTable; // 用到的dom节点 var isRendered = false; var $toolbar = $('<div class="txt-toolbar"></div>'); var $triangle = $('<div class="tip-triangle"></div>'); var $delete = $('<a href="#"><i class="wangeditor-menu-img-trash-o"></i></a>'); var $zoomSmall = $('<a href="#"><i class="wangeditor-menu-img-search-minus"></i></a>'); var $zoomBig = $('<a href="#"><i class="wangeditor-menu-img-search-plus"></i></a>'); // 渲染到页面 function render() { if (isRendered) { return; } // 绑定事件 bindEvent(); // 拼接 渲染到页面上 $toolbar.append($triangle) .append($delete) .append($zoomSmall) .append($zoomBig); editor.$editorContainer.append($toolbar); isRendered = true; } // 绑定事件 function bindEvent() { // 统一执行命令的方法 var commandFn; function command(e, callback) { if (commandFn) { editor.customCommand(e, commandFn, callback); } } // 删除 $delete.click(function (e) { commandFn = function () { $currentTable.remove(); }; command(e, function () { setTimeout(hide, 100); }); }); // 放大 $zoomBig.click(function (e) { commandFn = function () { $currentTable.css({ width: '100%' }); }; command(e, function () { setTimeout(show); }); }); // 缩小 $zoomSmall.click(function (e) { commandFn = function () { $currentTable.css({ width: 'auto' }); }; command(e, function () { setTimeout(show); }); }); } // 显示 toolbar function show() { if ($currentTable == null) { return; } $currentTable.addClass('clicked'); var tablePosition = $currentTable.position(); var tableTop = tablePosition.top; var tableLeft = tablePosition.left; var tableHeight = $currentTable.outerHeight(); var tableWidth = $currentTable.outerWidth(); // --- 定位 toolbar --- // 计算初步结果 var top = tableTop + tableHeight; var left = tableLeft; var marginLeft = 0; var txtTop = $txt.position().top; var txtHeight = $txt.outerHeight(); if (top > (txtTop + txtHeight)) { // top 不得超出编辑范围 top = txtTop + txtHeight; } // 显示(方便计算 margin) $toolbar.show(); // 计算 margin var width = $toolbar.outerWidth(); marginLeft = tableWidth / 2 - width / 2; // 定位 $toolbar.css({ top: top + 5, left: left, 'margin-left': marginLeft }); } // 隐藏 toolbar function hide() { if ($currentTable == null) { return; } $currentTable.removeClass('clicked'); $currentTable = null; $toolbar.hide(); } // click table 事件 $txt.on('click', 'table', function (e) { var $table = $(e.currentTarget); // 渲染 render(); if ($currentTable && ($currentTable.get(0) === $table.get(0))) { setTimeout(hide, 100); return; } // 显示 toolbar $currentTable = $table; show(); // 阻止冒泡 e.preventDefault(); e.stopPropagation(); }).on('click keypress scroll', function (e) { setTimeout(hide, 100); }); E.$body.on('click keypress scroll', function (e) { setTimeout(hide, 100); }); }); })(); ```