這篇文章主要介紹了使用JavaScript為Kindeditor自定義按鈕增加Audio標(biāo)簽的方法,KindEditor是一套開(kāi)源的HTML可視化編輯器,需要的朋友可以參考下
流程比較簡(jiǎn)單,主要有以下步驟:
注冊(cè)插件(按鈕、Lang、htmlTags、插件腳本)
基于media插件代碼修改
注冊(cè)插件
首先,全局配置kindeditor參數(shù):
KindEditor.lang({
audio : 'MP3'
});
KindEditor.options.htmlTags['audio'] = ['src','controls','autoplay','type'];
KindEditor.options.htmlTags['source'] = ['src','controls','autoplay','type'];
在初始化編輯器的地方,配置按鈕列表items參數(shù),把
'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'
]
});
為了便于閱讀,我把a(bǔ)udio按鈕放在最后,在 "幫助" 標(biāo)簽的后面。
為了讓按鈕能夠顯示,我們還需要指定一下css樣式:
<style>
.ke-icon-audio {
background-position: 0px -528px;
width: 16px;
height: 16px;
}
</style>
這里我圖方便,直接用了自帶的音視頻按鈕的圖標(biāo),自定義圖標(biāo)請(qǐng)手動(dòng)指定 background 樣式屬性。
最后,創(chuàng)建腳本
kindeditor/plugins/audio/audio.js
audio目錄手動(dòng)建立。
我們把
plugins/media/media.js
中的代碼復(fù)制到audio.js里,然后著手修改。
修改media插件
主要是去掉一些無(wú)用的屬性,如 寬、高、自動(dòng)播放等,并修改插入代碼的部分,手動(dòng)構(gòu)建 "audio" 標(biāo)簽的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);
});
至此,整個(gè)插件基本結(jié)束。
需要注意的是,上傳文件用的是通用的配置uploadJson參數(shù),但會(huì)在上傳的時(shí)候自動(dòng)添加一個(gè)get參數(shù) "dir=audio" ,以便后臺(tái)識(shí)別:
url : K.addParam(uploadJson, 'dir=audio'),