ACE编辑器:动态创建一个新的编辑器
ACE editor: create a new editor dynamically
我有一个基于我可以添加和删除选项卡的布局选项卡,当我创建一个新的选项卡时,我想添加一个新的ACE编辑器(http://ace.ajax.org/)到它(我使用jquery ui选项卡),但不工作:
$(function() {
var $tab_title_input = $( "#tab_title"),
$tab_content_input = $( "#tab_content" );
var tab_counter = 3;
// tabs init with a custom tab template and an "add" callback filling in the content
var $tabs = $( "#tabs").tabs({
tabTemplate: "<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove Tab</span></li>",
add: function( event, ui ) {
var tab_content = $tab_content_input.val() || "Tab " + tab_counter + " content.";
$( ui.panel ).append("<div id='"editor2'">" + tab_content + "</div>"); }
});
// modal dialog init: custom buttons and a "close" callback reseting the form inside
var $dialog = $( "#dialog" ).dialog({
autoOpen: false,
modal: true,
buttons: {
Add: function() {
addTab();
$( this ).dialog( "close" );
},
Cancel: function() {
$( this ).dialog( "close" );
}
},
open: function() {
$tab_title_input.focus();
},
close: function() {
$form[ 0 ].reset();
}
});
// addTab form: calls addTab function on submit and closes the dialog
var $form = $( "form", $dialog ).submit(function() {
addTab();
$dialog.dialog( "close" );
return false;
});
// actual addTab function: adds new tab using the title input from the form above
function addTab() {
var tab_title = $tab_title_input.val() || "Tab " + tab_counter;
$tabs.tabs( "add", "#tabs-" + tab_counter, tab_title )
.tabs( "select", "#tabs-" + tab_counter, tab_title );
tab_counter++;
var content_height = $('.content').height();
$('.ui-tabs-panel').css('height', content_height - 97);
$('div#editor').css('height', content_height - 97);
var editor2 = ace.edit("editor2");
var scroll = editor2.renderer.setHScrollBarAlwaysVisible(false);
var JavaScriptMode = require("ace/mode/javascript").Mode;
editor2.getSession().setMode(new JavaScriptMode());
editor2.setTheme("ace/theme/twilight");
var content_height = $('.content').height();
$('.ui-tabs-panel').css('height', content_height - 97);
$('div#editor').css('height', content_height - 97);
}
// addTab button: just opens the dialog
$( "#add_tab" )
.button()
.click(function() {
$dialog.dialog( "open" );
});
// close icon: removing the tab on click
// note: closable tabs gonna be an option in the future - see http://dev.jqueryui.com/ticket/3924
$( "#tabs span.ui-icon-close" ).live( "click", function() {
var index = $( "li", $tabs ).index( $( this ).parent() );
$tabs.tabs( "remove", index );
});
});
</script>
我已经创建了一个小提琴,以便您可以开始使用ui选项卡和ace编辑器:http://jsfiddle.net/VEfyU/2/
如您所见,在左边的外部资源下,我添加了jquery UI和ace编辑器js文件。我使用jquery ui 1.10.3,没有使用"add",因为它现在已被弃用。
javascript:$(document).ready(function() {
// initialize tabs
$('#tabs').tabs();
// array containing all the editors we will create
var editors = [];
// initialize button listener
$('#addTab').on('click', function() {
console.log('add a tab with an ace editor instance');
var tabsElement = $('#tabs');
var tabsUlElement = tabsElement.find('ul');
// the panel id is a timestamp plus a random number from 0 to 10000
var tabUniqueId = new Date().getTime() + Math.floor(Math.random()*10000);
// create a navigation bar item for the new panel
var newTabNavElement = $('<li id="panel_nav_' + tabUniqueId + '"><a href="#panel_' + tabUniqueId + '">' + tabUniqueId + '</a></li>');
// add the new nav item to the DOM
tabsUlElement.append(newTabNavElement);
// create a new panel DOM
var newTabPanelElement = $('<div id="panel_' + tabUniqueId + '" data-tab-id="' + tabUniqueId + '">New editor ' + tabUniqueId + ': <br/></div>');
tabsElement.append(newTabPanelElement);
// refresh the tabs widget
tabsElement.tabs('refresh');
var tabIndex = $('#tabs ul li').index($('#panel_nav_' + tabUniqueId));
console.log('tabIndex: ' + tabIndex);
// activate the new panel
tabsElement.tabs('option', 'active', tabIndex);
// create the editor dom
var newEditorElement = $('<div id="editor_' + tabUniqueId + '">// some code here</div>');
newTabPanelElement.append(newEditorElement);
// initialize the editor in the tab
var editor = ace.edit('editor_' + tabUniqueId);
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/javascript");
// set the size of the panel
newTabPanelElement.width('600');
newTabPanelElement.height('600');
// set the size of the editor
newEditorElement.width('500');
newEditorElement.height('500');
// resize the editor
editor.resize();
editors.push({ id: tabUniqueId, instance: editor });
// add an editor/panel close button to the panel dom
var closeButton = $('<button class="close">close</button>');
newTabPanelElement.prepend(closeButton);
});
$('#tabs').on('click', '.close', function() {
console.log('close a tab and destroy the ace editor instance');
console.log($(this).parent());
var tabUniqueId = $(this).parent().attr('data-tab-id');
console.log(tabUniqueId);
var resultArray = $.grep(editors, function(n,i){
return n.id === tabUniqueId;
}, true);
var editor = resultArray[0].instance;
// destroy the editor instance
editor.destroy();
// remove the panel and panel nav dom
$('#tabs').find('#panel_nav_' + tabUniqueId).remove();
$('#tabs').find('#panel_' + tabUniqueId).remove();
});
});
html: <div id="tabs">
<ul>
</ul>
</div>
<button id="addTab">Add an editor</button>
相关文章:
- 一个页面上有多个Ace编辑器,没有预先设置元素
- 我在Phaser有一个项目.我想在画布上的元素上做一个用户图像编辑器
- 如何在一个页面中使用多个markDown编辑器
- 当我单击另一个文件时,如何在 ace 编辑器中更改内容
- 如何取消粗体文本?一个小小的所见即所得的编辑器
- 未捕获的类型错误: $(..).froala编辑器不是一个函数//解决方案被找到,但不确定如何使用它
- 另一个就地编辑器 - 一个jQuery就地编辑插件
- 当一个文件超过20000行时,您使用的是哪个编辑器或IDE
- 制作一个在线HTML编辑器
- 如何使用TinyMCE文本区域编辑器作为一个类
- 我可以在 dijit 编辑器中放置一个 iframe 吗?
- Sencha ExtJS 4.2:如何在一个网格中同步两个组合编辑器
- 如何限制用户在ui ace编辑器中只能编写一个javascript函数(方法)
- 如何构建一个轻量级的在线文本编辑器
- 如何在DojoGridX的单元格编辑器中根据另一个单元格的值过滤select组件的选项
- 文本编辑器插件,允许数据与另一个插件交互
- 如果tinyMCE编辑器是空白的,我该如何通过在其旁边附加一个字符串来验证它
- 如何在网页中实现一个可以突出显示LaTeX和AMS关键字的编辑器
- 在PyQT QWebkit中嵌入一个TinyMCE编辑器
- 我如何用一个插件添加多个按钮到我的WordPress帖子编辑器