Jak zmienić obszar tekstowy w edytor ACE?


96

Chciałbym móc konwertować określone obszary tekstu na stronie do edytorów ACE.

Czy ktoś ma jakieś wskazówki?

EDYTOWAĆ:

Mam plik editor.html działający z jednym obszarem tekstowym, ale jak tylko dodam drugi, drugi nie jest konwertowany na edytor.

EDYCJA 2:

Postanowiłem porzucić pomysł posiadania kilku i zamiast tego otworzyć jeden w nowym oknie. Moim nowym problemem jest to, że kiedy ukrywam () i pokazuję () obszar tekstowy, wyświetlacz działa nieprawidłowo. Jakieś pomysły?


1
Ten facet ma świetne rozwiązanie: gist.github.com/duncansmart/5267653
— billynoah

Odpowiedzi:


159

O ile rozumiałem ideę Asa, nie powinieneś sam tworzyć obszaru tekstowego jako edytora Asa. Zamiast tego należy utworzyć dodatkowy div i zaktualizować textarea za pomocą funkcji .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());
});

lub po prostu zadzwoń

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

tylko wtedy, gdy wyślesz formularz z podanym obszarem tekstu. Nie jestem pewien, czy jest to właściwy sposób korzystania z Ace, ale tak jest w przypadku GitHub .


1
Wartość textarea należy aktualizować tylko przy form.submit event no? Ponadto, zgodnie z tym: groups.google.com/group/ace-discuss/browse_thread/thread/… Nie ma obsługi zastępowania textarea. Twoja odpowiedź jest wtedy dobra. Dzięki.
— Damien

4
Czasami musisz zaktualizować wartość textarea w podróży, na przykład w celu zaimplementowania automatycznego zapisywania wersji roboczej lub w inny sposób.
— installero

Mam problem z tą metodą: wysyłanie SMS-a „SELECT 1 OR 2;” na ace.editor przejdzie 'SELECT&nbsp;1OR&nbps;2;'do textarea. Czy ktoś może mi powiedzieć, co robię źle?
— alexglue

alexglue, czy ustawiłeś white-space: nowrap na swoim obszarze tekstowym? github.com/ajaxorg/ace/issues/900
— installero

Installero, nie mam tej właściwości CSS w moim obszarze tekstowym. Więc nie, nie zrobiłem tego.
— alexglue

33

Duncansmart ma na swojej stronie github całkiem fajne rozwiązanie, progressive-ace, które pokazuje prosty sposób na podłączenie edytora ACE do twojej strony.

Zasadniczo otrzymujemy wszystkie <textarea>elementy z data-editoratrybutem i konwertujemy każdy na edytor ACE. Przykład ustawia również niektóre właściwości, które należy dostosować do własnych upodobań, i pokazuje, jak można używać dataatrybutów do ustawiania właściwości dla poszczególnych elementów, takich jak pokazywanie i ukrywanie rynny 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
Wysoce rekomendowane. Bardzo elastyczny i czysty!
— aaandre

5
Jedyną modyfikacją, jaką wprowadziłem w powyższym kodzie, jest zmiana textarea.css ('widoczność', 'ukryty'); do textarea.css ('display', 'none'); w przeciwnym razie na ekranie
— pojawiało

@NickGoloborodko - kilka lat spóźniony, ale zgadzam się i odpowiednio zaktualizowałem odpowiedź. Naprawiono również link asa, aby fragment działał ponownie.
— billynoah

@billynoah Użyłem tego kodu, ale mam puste miejsce, którego nie można edytować. Jak mogę to naprawić? Dzięki
— bleyk

nie mam pojęcia, najwyraźniej nie użyłeś tego kodu dokładnie tak, jak jest lub działałby - tak jak robi to fragment kodu. jeśli potrzebujesz pomocy w debugowaniu, powinieneś rozpocząć nowe pytanie.
— billynoah

8

Możesz mieć wielu edytorów asów. Po prostu nadaj każdemu obszarowi tekstów identyfikator i utwórz Edytor asów dla obu IDS w następujący sposób:

<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

Aby stworzyć edytor, po prostu wykonaj:

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

Muszą być wyraźnie ustawione i dopasowane do rozmiaru. Wydaje mi się, że przez show () i hide () odnosisz się do funkcji jQuery. Nie jestem pewien, jak dokładnie to robią, ale nie może modyfikować miejsca, które zajmuje w DOM. Ukrywam się i pokazuję za pomocą:

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

Jeśli użyjesz właściwości css „display”, to nie zadziała.

Sprawdź wiki tutaj, aby dowiedzieć się, jak dodawać motywy, tryby itp ... https://github.com/ajaxorg/ace/wiki/Embedding---API

Uwaga: nie muszą to być pola tekstowe, mogą to być dowolne elementy.


8
Tylko nie. Jeśli wywołasz ace.edit('code1'), otrzymasz śmieci takie jak: <textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>Innymi słowy, ace.edit próbuje wepchnąć się do obszaru tekstowego i nie jest to zbyt miłe.
— Ciantic

0

Dla każdego takiego jak ja, który chce tylko minimalnego, działającego przykładu użycia Ace z 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>


Widzę, że ktoś został odrzucony ... czy to nie zadziałało?
— Nic Scozzaro
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.