如何使textarea成为ACE编辑器?


96

我希望能够将页面上的特定textareas转换为ACE编辑器。

请问有人有指针吗?

编辑:

我使editor.html文件可以处理一个文本区域,但是一旦添加第二个文本区域,第二个区域就不会转换为编辑器。

编辑2:

我决定放弃拥有多个的想法,而是在新窗口中打开一个。我的新难题是,当我将hide()和show()用作文本区域时,显示会出错。有任何想法吗?


1
这个家伙有一个很棒的解决方案:gist.github.com/duncansmart/5267653
billynoah 2013年

Answers:


159

据我了解Ace的想法,您不应该使textarea成为Ace编辑器本身。您应该创建一个附加的div并使用.getSession()函数更新textarea 。

html

<textarea name="description"/>
<div id="description"/>

js

var editor = ace.edit("description");
var textarea = $('textarea[name="description"]').hide();
editor.getSession().setValue(textarea.val());
editor.getSession().on('change', function(){
  textarea.val(editor.getSession().getValue());
});

或只是打电话

textarea.val(editor.getSession().getValue());

仅当您使用给定的textarea提交表单时。我不确定这是否是使用Ace的正确方法,但这是在GitHub上使用的方法。


1
textarea值仅应在form.submit事件上更新吗?另外,根据以下内容:groups.google.com/group/ace-discuss/browse_thread/thread / ...不支持替换textarea。那么,您的答案就是一个好的答案。谢谢。
Damien

4
有时您需要在旅途中更新textarea值,例如实现草稿自动保存等。
installero

我在使用此方法时遇到麻烦:发短信“ SELECT 1 OR 2;” 在ace.editor上将放置'SELECT&nbsp;1OR&nbps;2;'到textarea。有人可以告诉我我在做什么错吗?
alexglue 2014年

alexglue,您是否在文本区域上设置了空白:nowrap?github.com/ajaxorg/ace/issues/900
installero

Installero,我的textarea上没有此CSS属性。所以,不,我没有。
alexglue 2014年

33

Duncansmart在他的github页面上有一个很棒的解决方案,progressive-ace,它演示了一种将ACE编辑器连接到页面的简单方法。

基本上,我们获得<textarea>具有data-editor属性的所有元素,并将每个元素转换为ACE编辑器。该示例还设置了一些您应该根据自己的喜好自定义的属性,并演示了如何使用data属性来设置每个元素的属性,例如使用来显示和隐藏装订线data-gutter

// Hook up ACE editor to all textareas with data-editor attribute
$(function() {
  $('textarea[data-editor]').each(function() {
    var textarea = $(this);
    var mode = textarea.data('editor');
    var editDiv = $('<div>', {
      position: 'absolute',
      width: textarea.width(),
      height: textarea.height(),
      'class': textarea.attr('class')
    }).insertBefore(textarea);
    textarea.css('display', 'none');
    var editor = ace.edit(editDiv[0]);
    editor.renderer.setShowGutter(textarea.data('gutter'));
    editor.getSession().setValue(textarea.val());
    editor.getSession().setMode("ace/mode/" + mode);
    editor.setTheme("ace/theme/idle_fingers");

    // copy back to textarea on form submit...
    textarea.closest('form').submit(function() {
      textarea.val(editor.getSession().getValue());
    })
  });
});
textarea {
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js"></script>
<textarea name="my-xml-editor" data-editor="xml" data-gutter="1" rows="15"></textarea>
<br>
<textarea name="my-markdown-editor" data-editor="markdown" data-gutter="0" rows="15"></textarea>


3
强烈推荐。非常灵活和干净!
aaandre

5
我对上述代码所做的唯一修改是更改了textarea.css('visibility','hidden'); 到textarea.css('display','none'); 否则,我会在屏幕上得到多余的空白
Nick Goloborodko 2014年

@NickGoloborodko-这里晚了几年,但是我同意,并且我已经相应更新了答案。另外,修复了ace链接,以便该代码段再次起作用。
billynoah

@billynoah我使用了这段代码,但是我得到的是一个无法编辑的空白,我该如何解决呢?谢谢
bleyk '18

不知道,显然您没有完全按照原样使用或可能会正常工作,就像代码段一样。如果需要调试帮助,则应该开始一个新问题。
Billynoah

8

您可以有多个Ace编辑器。只需为每个文本区域指定一个ID,然后为两个IDS创建一个Ace编辑器,如下所示:

<style>
#editor, #editor2 {
    position: absolute;
    width: 600px;
    height: 400px;
}
</style>
<div style="position:relative; height: 450px; " >
&nbsp;
<div id="editor">some text</div>
</div>
<div style="position:relative; height: 450px; " >
&nbsp;
<div id="editor2">some text</div>
</div>
<script src="ace.js" type="text/javascript" charset="utf-8"></script>
<script src="theme-twilight.js" type="text/javascript" charset="utf-8"></script>
<script src="mode-xml.js" type="text/javascript" charset="utf-8"></script>
<script>
window.onload = function() {
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/twilight");
    var XmlMode = require("ace/mode/xml").Mode;
    editor.getSession().setMode(new XmlMode());

    var editor2 = ace.edit("editor2");
    editor2.setTheme("ace/theme/twilight");
    editor2.getSession().setMode(new XmlMode());

};
</script>

1

要创建编辑器,只需执行以下操作:

HTML:

<textarea id="code1"></textarea>
<textarea id="code2"></textarea>

JS:

var editor1 = ace.edit('code1');
var editor2 = ace.edit('code2');
editor1.getSession().setValue("this text will be in the first editor");
editor2.getSession().setValue("and this in the second");

CSS:

#code1, code2 { 
  position: absolute;
  width: 400px;
  height: 50px;
}

它们必须明确地定位和确定大小。我相信通过show()和hide()可以指的是jQuery函数。我不确定他们是如何做到的,但是它不能修改它在DOM中占用的空间。我隐藏并显示使用:

$('#code1').css('visibility', 'visible');
$('#code2').css('visibility', 'hidden');

如果您使用css属性“显示”,则将无法使用。

在此处查看Wiki,了解如何添加主题,模式等... https://github.com/ajaxorg/ace/wiki/Embedding---API

注意:它们不必是文本区域,它们可以是您想要的任何元素。


8
除了,没有 如果您调用它,ace.edit('code1')则会得到类似以下的垃圾:<textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>换句话说,ace.edit尝试将自身填充到textarea中,这不是很好。
Ciantic 2011年

0

对于像我这样只需要CDN中使用Ace的最小工作示例的人:

<!DOCTYPE html>
<html lang="en">

<body style="margin:0">
  <div id="editor">function () { 
  console.log('this is a demo, try typing!')
}
  </div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/ace.js" type="text/javascript" charset="utf-8"></script>
  <script>
    var editor = ace.edit("editor");
    editor.setTheme("ace/theme/monokai");
    editor.getSession().setMode("ace/mode/javascript");
    document.getElementById("editor").style.height = "120px";
  </script>
</body>

</html>


我看到有人投票否决了它...对您不起作用吗?
Nic Sc​​ozzaro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.