Bagaimana cara menjadikan textarea editor ACE?


96

Saya ingin dapat mengubah area teks tertentu pada sebuah halaman menjadi editor ACE.

Apakah ada yang punya petunjuk, tolong?

EDIT:

Saya memiliki file editor.html yang bekerja dengan satu textarea, tetapi segera setelah saya menambahkan yang kedua, yang kedua tidak diubah menjadi editor.

EDIT 2:

Saya memutuskan untuk membuang ide untuk memiliki beberapa, dan sebagai gantinya membukanya di jendela baru. Masalah baru saya adalah ketika saya menyembunyikan () dan menampilkan () textarea, tampilan menjadi serba salah. Ada ide?


1
Orang ini memiliki solusi yang cukup luar biasa: gist.github.com/duncansmart/5267653
billynoah

Jawaban:


159

Sejauh yang saya mengerti tentang ide Ace, Anda seharusnya tidak membuat textarea editor Ace itu sendiri. Anda harus membuat div tambahan dan memperbarui textarea menggunakan fungsi .getSession () sebagai gantinya.

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

atau panggil saja

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

hanya jika Anda mengirimkan formulir dengan textarea yang diberikan. Saya tidak yakin apakah ini cara yang benar untuk menggunakan Ace, tetapi ini adalah cara yang digunakan di GitHub .


1
Nilai textarea seharusnya hanya diperbarui pada acara form.submit no? Juga, menurut ini: groups.google.com/group/ace-discuss/browse_thread/thread/… Tidak ada dukungan untuk penggantian textarea. Maka jawaban Anda adalah jawaban yang bagus. Terima kasih.
Damien

4
Terkadang Anda perlu memperbarui nilai textarea saat dalam perjalanan, misalnya untuk menerapkan draf simpan otomatis atau lebih.
installero

Saya mengalami masalah dengan metode ini: mengirim SMS 'PILIH 1 ATAU 2;' di ace.editor akan dimasukkan 'SELECT&nbsp;1OR&nbps;2;'ke textarea. Bisakah seseorang memberi tahu saya apa yang saya lakukan salah?
alexglue

alexglue, apakah Anda menyetel white-space: nowrap pada textarea Anda? github.com/ajaxorg/ace/issues/900
installero

Installero, saya tidak memiliki properti css ini di textarea saya. Jadi, tidak, saya tidak melakukannya.
alexglue

33

Duncansmart memiliki solusi yang cukup mengagumkan di halaman github-nya, progresif-ace yang menunjukkan satu cara sederhana untuk menghubungkan editor ACE ke halaman Anda.

Pada dasarnya kita mendapatkan semua <textarea>elemen dengan data-editoratribut dan mengubahnya menjadi editor ACE. Contoh ini juga menyetel beberapa properti yang harus Anda sesuaikan dengan keinginan Anda, dan mendemonstrasikan bagaimana Anda dapat menggunakan dataatribut untuk menyetel properti per elemen seperti menampilkan dan menyembunyikan selokan 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
Sangat dianjurkan. Sangat fleksibel dan bersih!
aaandre

5
Satu-satunya modifikasi yang saya buat pada kode di atas adalah yang diubah textarea.css ('visibility', 'hidden'); ke textarea.css ('display', 'none'); jika tidak, saya mendapatkan ruang kosong ekstra di layar
Nick Goloborodko

@NickGoloborodko - terlambat beberapa tahun di sini tetapi saya setuju dan saya telah memperbarui jawabannya. Juga, perbaiki tautan ace sehingga cuplikan berfungsi kembali.
billynoah

@billynoah Saya menggunakan kode ini tetapi Yang saya punya adalah ruang kosong yang tidak dapat diedit bagaimana saya bisa memperbaikinya? Terima kasih
bleyk

tidak tahu, jelas Anda tidak menggunakan kode ini persis seperti itu atau akan berhasil - seperti yang dilakukan cuplikan. jika Anda membutuhkan bantuan debugging, Anda harus memulai pertanyaan baru.
billynoah

8

Anda dapat memiliki beberapa Editor Ace. Berikan saja setiap area teks sebuah ID dan buat Editor Ace untuk kedua IDS seperti ini:

<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

Untuk membuat editor, lakukan saja:

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;
}

Mereka harus diposisikan dan diukur secara eksplisit. Dengan show () dan hide () Saya yakin Anda mengacu pada fungsi jQuery. Saya tidak yakin persis bagaimana mereka melakukannya, tetapi itu tidak dapat mengubah ruang yang dibutuhkan di DOM. Saya bersembunyi dan menunjukkan menggunakan:

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

Jika Anda menggunakan properti css 'display' itu tidak akan bekerja.

Lihat wiki di sini untuk mengetahui cara menambahkan tema, mode, dll ... https://github.com/ajaxorg/ace/wiki/Embedding---API

Catatan: mereka tidak harus textarea, mereka bisa menjadi elemen apapun yang Anda inginkan.


8
Kecuali, tidak. Jika Anda memanggil ace.edit('code1')Anda mendapatkan sampah seperti: <textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>Dengan kata lain ace.edit mencoba memasukkan dirinya ke dalam textarea dan ini tidak terlalu bagus.
Ciantic

0

Untuk siapa pun seperti saya yang hanya menginginkan contoh kerja minimal menggunakan Ace dari 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>


Saya melihat seseorang mendapat suara negatif ... apakah itu tidak berhasil untuk Anda?
Nic Scozzaro
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.