Як зробити текстову область редактором ACE?


96

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

Чи є у кого-небудь підказки, будь ласка?

РЕДАГУВАТИ:

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

РЕДАКТУВАТИ 2:

Я вирішив відмовитись від ідеї мати кілька, а натомість відкрити одну в новому вікні. Моє нове скрутне становище полягає в тому, що коли я приховую () і показую () текстове поле, дисплей виходить з ладу. Будь-які ідеї?


1
Цей хлопець має досить дивовижне рішення: gist.github.com/duncansmart/5267653
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 .


1
Значення текстової області слід оновлювати лише у формі. Крім того, відповідно до цього: groups.google.com/group/ace-discuss/browse_thread/thread/… Відсутня підтримка заміни текстової області. Тоді ваша відповідь хороша. Дякую.
Damien

4
Іноді вам потрібно оновлювати значення текстової області в дорозі, наприклад, для реалізації автоматичного збереження чернетки або близько того.
installero

У мене проблеми з цим методом: надсилання текстових повідомлень "SELECT 1 OR 2;" на ace.editor додасть 'SELECT&nbsp;1OR&nbps;2;'до textarea. Хтось може сказати мені, що я роблю не так?
alexglue

alexglue, ти встановив пробіл: nowrap на текстовій області? github.com/ajaxorg/ace/issues/900
installero

Installero, у мене немає цієї властивості css у текстовій області. Отже, ні, я цього не зробив.
alexglue

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 ('видимість', 'прихована'); to textarea.css ('display', 'none'); інакше я отримував зайве порожнє місце на екрані
Нік Голобородько

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

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>


Бачу, хтось голосував проти ... чи не вдалося це вам?
Нік Скоццаро,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.