Bir metin alanını nasıl ACE editörü yaparım?


96

Bir sayfadaki belirli metin alanlarını ACE editörleri olacak şekilde dönüştürebilmek istiyorum.

Herhangi bir işaret eden var mı lütfen?

DÜZENLE:

Editör.html dosyası bir metin alanıyla çalışıyor, ancak bir saniye ekler eklemez, ikincisi bir düzenleyiciye dönüştürülmüyor.

DÜZENLEME 2:

Birkaç tanesine sahip olma fikrini bir kenara atmaya ve bunun yerine yeni bir pencerede birini açmaya karar verdim. Yeni durumum, metin alanını gizlediğimde () ve gösterdiğimde () ekranın ters gitmesidir. Herhangi bir fikir?


1
Bu adamın harika bir çözümü var: gist.github.com/duncansmart/5267653
billynoah

Yanıtlar:


159

Ace fikrini anladığım kadarıyla, bir metin alanını kendisi bir Ace editörü yapmamalısın . Ek bir div oluşturmalı ve bunun yerine .getSession () işlevini kullanarak metin alanını güncellemelisiniz .

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

ya da sadece ara

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

yalnızca formu verilen metin alanıyla gönderdiğinizde. Bunun Ace'i kullanmanın doğru yolu olup olmadığından emin değilim, ancak GitHub'da bu şekilde kullanılıyor .


1
Textarea değeri yalnızca form.submit event no? Ayrıca, buna göre: groups.google.com/group/ace-discuss/browse_thread/thread/… Metin alanı değişimi için destek yoktur. Cevabınız o zaman iyi olanıdır. Teşekkür.
Damien

4
Bazen hareket halindeyken bir metin alanı değerini güncellemeniz gerekir, örneğin taslak otomatik kaydetme gibi işlemleri uygulamak için.
installero

Bu yöntemle ilgili bir sorun yaşıyorum: 'SELECT 1 OR 2;' as üzerinde. editör 'SELECT&nbsp;1OR&nbps;2;'metin alanına koyacaktır . Biri bana neyi yanlış yaptığımı söyleyebilir mi?
alexglue

alexglue, beyaz boşluğu ayarladın mı: şimdi metin alanınızda tuzağa düşüyor musunuz? github.com/ajaxorg/ace/issues/900
installero

Installero, metin alanımda bu css özelliğine sahip değilim. Yani, hayır, yapmadım.
alexglue

33

Duncanansmart'ın github sayfasında oldukça harika bir çözümü var. progressive-ace , sayfanıza bir ACE editörübasit bir yolunu gösteriyor.

Temel olarak <textarea>, data-editorözniteliğe sahip tüm öğeleri alırız ve her birini bir ACE düzenleyicisine dönüştürürüz. Örnek ayrıca, beğeninize göre özelleştirmeniz gereken bazı özellikleri ayarlar datave cilt payını gösterme ve gizleme gibi öğe başına özellikleri ayarlamak için öznitelikleri nasıl kullanabileceğinizi gösterir 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
Şiddetle tavsiye edilir. Çok esnek ve temiz!
aaandre

5
Yukarıdaki kodda yaptığım tek değişiklik textarea.css ('görünürlük', 'gizli'); textarea.css'ye ('görüntü', 'yok'); aksi halde ekranda fazladan boşluk
alıyordum

@NickGoloborodko - burada birkaç yıl geç kaldım ama kabul ediyorum ve cevabı buna göre güncelledim. Ayrıca, pasajın tekrar çalışması için as bağlantısını düzeltti.
billynoah

@billynoah Bu kodu kullandım ama elimde olan şey düzenlenemeyen bir boşluk. Teşekkürler
bleyk

hiçbir fikriniz yok, açıkça bu kodu olduğu gibi kullanmadınız yoksa işe yarardı - tıpkı pasajda olduğu gibi. Hata ayıklama konusunda yardıma ihtiyacınız varsa, yeni bir soru başlatmalısınız.
billynoah

8

Birden fazla As Editörünüz olabilir. Her metin alanına bir ID verin ve her iki IDS için de aşağıdaki gibi bir Ace Editor oluşturun:

<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

Bir düzenleyici oluşturmak için şunu yapın:

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

Açıkça konumlandırılmalı ve boyutlandırılmalıdır. Show () ve hide () ile jQuery işlevlerine atıfta bulunduğunuza inanıyorum. Tam olarak nasıl yaptıklarından emin değilim, ancak DOM'da kapladığı alanı değiştiremez. Şunu kullanarak gizlerim ve gösteririm:

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

'Display' css özelliğini kullanırsanız çalışmayacaktır.

Temaların, modların vb. Nasıl ekleneceğini öğrenmek için buradaki wiki'ye göz atın ... https://github.com/ajaxorg/ace/wiki/Embedding---API

Not: Metin alanları olmak zorunda değiller, istediğiniz herhangi bir öğe olabilirler.


8
Hayır hariç. Eğer çağırırsanız, şöyle bir ace.edit('code1')çöp alırsınız: <textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>Başka bir deyişle, ace.edit kendini textarea içinde doldurmaya çalışır ve bu pek hoş değildir.
Ciantic

0

Benim gibi, CDN'den Ace kullanmanın minimal, çalışan bir örneğini isteyen herkes için:

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


Birinin olumsuz oy verdiğini görüyorum ... bu senin için işe yaramadı mı?
Nic Scozzaro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.