使用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 相关文章推荐
dropdownlist之间的互相联动实现(显示与隐藏)
Nov 24 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
JavaScript的null和undefined区别示例介绍
Sep 15 Javascript
前端轻量级MVC框架CanJS详解
Sep 26 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
package.json文件配置详解
Jun 15 Javascript
Webpack如何引入bootstrap的方法
Jun 17 Javascript
js注册时输入合法性验证方法
Oct 21 Javascript
深入理解node.js http模块
Jan 24 Javascript
详解webpack4升级指南以及从webpack3.x迁移
Jun 12 Javascript
详解微信小程序input标签正则初体验
Aug 18 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
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
javascript常用功能汇总
2015/07/05 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
vue.js的安装方法
2017/05/12 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
element中的$confirm的使用
2020/04/26 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
学生会竞选自荐信
2013/10/12 职场文书
门卫工作岗位职责
2013/12/17 职场文书
初中女生自我鉴定
2013/12/19 职场文书
银行学习十八大感想
2014/01/11 职场文书
七年级地理教学反思
2014/01/26 职场文书
企业年度评优方案
2014/06/02 职场文书
活动费用申请报告
2015/05/15 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript