使用JavaScript为Kindeditor自定义按钮增加Audio标签


Posted in Javascript onMarch 18, 2016

流程比较简单,主要有以下步骤:

  • 注册插件(按钮、Lang、htmlTags、插件脚本)
  • 基于media插件代码修改

注册插件

首先,全局配置kindeditor参数:

KindEditor.lang({
 audio : 'MP3'
});
 KindEditor.options.htmlTags['audio'] = ['src','controls','autoplay','type'];
 KindEditor.options.htmlTags['source'] = ['src','controls','autoplay','type'];

在初始化编辑器的地方,配置按钮列表items参数,把
'audio'
放在合适的位置:

KindEditor.ready(function(K) {
editor = K.create('#info,#spread_info', {
  //其他配置省略...
  items : [
    'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
    'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
    'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
    'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
    'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
    'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image', 'multiimage',
     '|' ,'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
    'anchor', 'link', 'unlink', '|', 'about','audio'
  ]
});

为了便于阅读,我把audio按钮放在最后,在 "帮助" 标签的后面。

为了让按钮能够显示,我们还需要指定一下css样式:

<style>
  .ke-icon-audio {
    background-position: 0px -528px;
    width: 16px;
    height: 16px;
  }
</style>

这里我图方便,直接用了自带的音视频按钮的图标,自定义图标请手动指定 background 样式属性。

最后,创建脚本

kindeditor/plugins/audio/audio.js

audio目录手动建立。

我们把

plugins/media/media.js

中的代码复制到audio.js里,然后着手修改。

修改media插件

主要是去掉一些无用的属性,如 宽、高、自动播放等,并修改插入代码的部分,手动构建 "audio" 标签的html代码。

/**
 * Created by admin on 15-5-6.
 */

KindEditor.plugin('audio', function(K) {
  var self = this, name = 'audio', lang = self.lang(name + '.'),
    allowMediaUpload = K.undef(self.allowMediaUpload, true),
    allowFileManager = K.undef(self.allowFileManager, false),
    formatUploadUrl = K.undef(self.formatUploadUrl, true),
    uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
  self.plugin.media = {
    edit : function() {
      var html = [
        '<div style="padding:20px;">',
        //url
        '<div class="ke-dialog-row">',
        '<label for="keUrl" style="width:60px;">MP3 URL</label>',
        '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" />  ',
        '<input type="button" class="ke-upload-button" value="上传" />  ',
        '</div>',

        '</div>'
      ].join('');
      var dialog = self.createDialog({
          name : name,
          width : 450,
          height : 230,
          title : self.lang(name),
          body : html,
          yesBtn : {
            name : self.lang('yes'),
            click : function(e) {
              var url = K.trim(urlBox.val()),
                width = widthBox.val(),
                height = heightBox.val();
              if (url == 'http://' || K.invalidUrl(url)) {
                alert(self.lang('invalidUrl'));
                urlBox[0].focus();
                return;
              }
              if (!/^\d*$/.test(width)) {
                alert(self.lang('invalidWidth'));
                widthBox[0].focus();
                return;
              }
              if (!/^\d*$/.test(height)) {
                alert(self.lang('invalidHeight'));
                heightBox[0].focus();
                return;
              }
              var html = '<p><audio src="'+url+'" controls="controls"></audio><br/></p>';
              self.insertHtml(html).hideDialog().focus();
            }
          }
        }),
        div = dialog.div,
        urlBox = K('[name="url"]', div),
        viewServerBtn = K('[name="viewServer"]', div),
        widthBox = K('[name="width"]', div),
        heightBox = K('[name="height"]', div),
        autostartBox = K('[name="autostart"]', div);
      urlBox.val('http://');

      if (allowMediaUpload) {
        var uploadbutton = K.uploadbutton({
          button : K('.ke-upload-button', div)[0],
          fieldName : 'imgFile',
          url : K.addParam(uploadJson, 'dir=audio'),
          afterUpload : function(data) {
            dialog.hideLoading();
            if (data.error === 0) {
              var url = data.url;
              if (formatUploadUrl) {
                url = K.formatUrl(url, 'absolute');
              }
              urlBox.val(url);
              if (self.afterUpload) {
                self.afterUpload.call(self, url);
              }
              alert(self.lang('uploadSuccess'));
            } else {
              alert(data.message);
            }
          },
          afterError : function(html) {
            dialog.hideLoading();
            self.errorDialog(html);
          }
        });
        uploadbutton.fileBox.change(function(e) {
          dialog.showLoading(self.lang('uploadLoading'));
          uploadbutton.submit();
        });
      } else {
        K('.ke-upload-button', div).hide();
      }

      if (allowFileManager) {
        viewServerBtn.click(function(e) {
          self.loadPlugin('filemanager', function() {
            self.plugin.filemanagerDialog({
              viewType : 'LIST',
              dirName : 'media',
              clickFn : function(url, title) {
                if (self.dialogs.length > 1) {
                  K('[name="url"]', div).val(url);
                  self.hideDialog();
                }
              }
            });
          });
        });
      } else {
        viewServerBtn.hide();
      }

      var img = self.plugin.getSelectedMedia();
      if (img) {
        var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
        urlBox.val(attrs.src);
        widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
        heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
        autostartBox[0].checked = (attrs.autostart === 'true');
      }
      urlBox[0].focus();
      urlBox[0].select();
    },
    'delete' : function() {
      self.plugin.getSelectedMedia().remove();
    }
  };
  self.clickToolbar(name, self.plugin.media.edit);
});

至此,整个插件基本结束。

需要注意的是,上传文件用的是通用的配置uploadJson参数,但会在上传的时候自动添加一个get参数 "dir=audio" ,以便后台识别:

url : K.addParam(uploadJson, 'dir=audio'),
Javascript 相关文章推荐
ExtJs的Date格式字符代码
Dec 30 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
Feb 03 Javascript
JS操作Cookies的小例子
Oct 15 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 Javascript
JS、DOM和JQuery之间的关系示例分析
Apr 09 Javascript
javascript 控制input只允许输入的各种指定内容
Jun 19 Javascript
30个经典的jQuery代码开发技巧
Dec 15 Javascript
JavaScript插件化开发教程(六)
Feb 01 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
May 16 Javascript
Bootstrap表格和栅格分页实例详解
May 20 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
Apr 08 Javascript
基于jQuery实现收缩展开功能
Mar 18 #Javascript
基于javascript显示当前时间以及倒计时功能
Mar 18 #Javascript
jQuery.deferred对象使用详解
Mar 18 #Javascript
JS中的二叉树遍历详解
Mar 18 #Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
Mar 18 #Javascript
Javascript的表单验证-揭开正则表达式的面纱
Mar 18 #Javascript
Javascript的表单验证-初识正则表达式
Mar 18 #Javascript
You might like
PHP 文件上传全攻略
2010/04/28 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
《夏夜多美》教学反思
2014/02/17 职场文书
网站美工岗位职责
2014/04/02 职场文书
专职安全员岗位职责
2015/04/11 职场文书
公路施工安全责任书
2015/05/08 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书