Как сделать текстовое поле редактором ACE?

96

Я хотел бы иметь возможность преобразовывать определенные текстовые поля на странице в редакторы ACE.

У кого-нибудь есть указатели, пожалуйста?

РЕДАКТИРОВАТЬ:

У меня есть файл editor.html, работающий с одним текстовым полем, но как только я добавляю второе, второе не преобразуется в редактор.

РЕДАКТИРОВАТЬ 2:

Я решил отказаться от идеи иметь несколько и вместо этого открыть одну в новом окне. Моя новая затруднительная ситуация заключается в том, что когда я скрываю () и показываю () текстовое поле, отображение искажается. Любые идеи?

Павел
источник
1
У этого парня есть отличное
billynoah,

Ответы:

159

Насколько я понял идею Ace, не стоит делать текстовое поле редактором Ace. Вам следует создать дополнительный div и обновить текстовое поле, используя вместо этого функцию .getSession () .

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());

только когда вы отправляете форму с заданным текстовым полем. Я не уверен, что это правильный способ использования Ace, но именно так он используется на GitHub .

installero
источник
1
Значение textarea должно обновляться только при событии form.submit no? Кроме того, согласно этому: groups.google.com/group/ace-discuss/browse_thread/thread/… Нет поддержки замены текстового поля . Тогда ваш ответ правильный. Спасибо.
Дэмиен
4
Иногда вам нужно обновить значение textarea на ходу, например, для реализации автоматического сохранения черновика или около того.
installero
У меня проблема с этим методом: текстовое сообщение «ВЫБРАТЬ 1 ИЛИ 2;» на ace.editor поместит 'SELECT&nbsp;1OR&nbps;2;'в textarea. Может кто-нибудь сказать мне, что я делаю не так?
alexglue 01
alexglue, вы установили white-space: nowrap на своем текстовом поле? github.com/ajaxorg/ace/issues/900
installero
Installero, у меня нет этого свойства css в моем текстовом поле. Так что нет, я этого не сделал.
alexglue 01
33

У Дункансмарта есть довольно крутое решение на своей странице github, прогрессив-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'); to textarea.css ('дисплей', 'нет'); иначе у меня на экране
появлялось
@NickGoloborodko - здесь опоздал на пару лет, но я согласен и соответственно обновил ответ. Кроме того, исправлена ​​ссылка на туз, чтобы фрагмент снова работал.
billynoah
@billynoah Я использовал этот код, но у меня есть пустое место, которое нельзя редактировать, как я могу это исправить? Спасибо
bleyk
понятия не имею, очевидно, что вы использовали этот код не в том виде, в каком он есть, иначе он сработал бы - точно так же, как это делает фрагмент. если вам нужна помощь в отладке, вы должны задать новый вопрос.
billynoah
8

У вас может быть несколько редакторов Ace. Просто дайте каждому текстовому полю идентификатор и создайте Ace Editor для обеих IDS, например:

<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>
Breck
источник
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 display, оно не будет работать.

Ознакомьтесь с вики здесь, чтобы узнать, как добавлять темы, режимы и т. Д. 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 пытается запихнуть себя в текстовое поле, и это не очень хорошо.
Ciantic
0

Для всех вроде меня, которым просто нужен минимальный рабочий пример использования Ace из CDN:

<!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>

Ник Скоццаро
источник
Я вижу, что кто-то проголосовал против ... У вас это не сработало?
Ник Скоццаро