使用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 相关文章推荐
JS 如果改变span标签的是否隐藏属性
Oct 06 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
Jan 19 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
Jun 18 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
Sep 23 Javascript
微信小程序 使用canvas制作K线实例详解
Jan 12 Javascript
Bootstrap表单控件学习使用
Mar 07 Javascript
JS实现给json数组动态赋值的方法示例
Mar 19 Javascript
Vue中插入HTML代码的方法
Sep 21 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
原生js实现随机点名
Jul 05 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php str_replace的替换漏洞
2008/03/15 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
php简单统计在线人数的方法
2016/05/10 PHP
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
在Django的session中使用User对象的方法
2015/07/23 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python 调用Java实例详解
2017/06/02 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Python 线程池用法简单示例
2019/10/02 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
终端业务员岗位职责
2013/11/27 职场文书
研修第一天随笔感言
2014/02/15 职场文书
环境保护建议书
2014/08/26 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
新教师教学工作总结
2015/08/14 职场文书
2015元旦感言
2015/12/09 职场文书
数学复习课教学反思
2016/02/18 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python