textareaをACEエディターにするにはどうすればよいですか?


96

ページ上の特定のテキストエリアをACEエディターに変換できるようにしたいのですが。

誰かポインタがありますか?

編集:

editor.htmlファイルで1つのtextareaを処理していますが、2番目を追加するとすぐに、2番目はエディターに変換されません。

編集2:

私はいくつかのアイデアを捨て、代わりに新しいウィンドウで1つ開くことにしました。私の新しい問題は、textareaをhide()およびshow()すると、表示がおかしくなることです。何か案は?


1
この人にはかなり素晴らしい解決策があります:gist.github.com/duncansmart/5267653
ビリーノア

回答:


159

私がAceの考えを理解している限り、textareaをAceエディター自体にするべきではありません。追加のdivを作成し、代わりに.getSession()関数を使用してtextareaを更新する必要があります。

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

あなたが与えられたtextareaでフォームを提出するときだけ。これがAceの正しい使い方かどうかはわかりませんが、GitHubでの使い方と同じです。


1
textarea値はform.submitイベントでのみ更新する必要がありますか?また、これによれば:groups.google.com/group/ace-discuss/browse_thread/thread/…textarea置換のサポートはありません。それであなたの答えは良いものです。どうも。
Damien

4
たとえばドラフトの自動保存を実装するためなど、外出先でtextarea値を更新する必要がある場合があります。
installero

この方法で問題が発生しました:テキストメッセージ「SELECT 1 OR 2;」ace.editorでtextareaに書き込みます'SELECT&nbsp;1OR&nbps;2;'。誰かが私が間違っていることを教えてもらえますか?
alexglue 2014

alexglue、textareaにwhite-space:nowrapを設定しましたか?github.com/ajaxorg/ace/issues/900
installero

インストーラー、私のテキストエリアにこのcssプロパティはありません。だから、いいえ、私はしませんでした。
alexglue 2014

33

Duncansmartは、彼のgithubページにプログレッシブエースという非常に素晴らしいソリューションを提供しています。これは、ACEエディターをページに接続する1つの簡単な方法を示しています。

基本的に<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 2013年

5
上記のコードに加えた変更は、textarea.css( 'visibility'、 'hidden');のみです。textarea.css( 'display'、 'none'); それ以外の場合、画面に余分な空白が表示されていました
Nick Goloborodko 14

@NickGoloborodko-ここで数年遅れますが、私は同意し、それに応じて答えを更新しました。また、スニペットが再び機能するように、aceリンクを修正しました。
ビリーノア2017年

@billynoahこのコードを使用しましたが、編集できない空白スペースがありますが、どうすれば修正できますか?ありがとう
bleyk 2018

わからない。明らかに、このコードをそのまま使用しなかった場合、またはスニペットのように機能したかどうか。デバッグのヘルプが必要な場合は、新しい質問を開始してください。
ビリーノア2018

8

複数のエースエディタを使用できます。各textareaにIDを指定し、次のように両方のIDSのAce Editorを作成します。

<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'を使用する場合は機能しません。

テーマ、モードなどを追加する方法については、こちらのwikiを確認してください... https://github.com/ajaxorg/ace/wiki/Embedding---API

注:それらはtextareasである必要はなく、任意の要素にすることができます。


8
違います。呼び出すと、ace.edit('code1')次のようなガベージが表示されます<textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>。言い換えると、ace.editはそれ自体をtextarea内に詰め込もうとしますが、これはあまり良くありません。
Ciantic 2011年

0

CDNからAceを使用する最小限の実用的な例を必要とする私のような人のために:

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


誰かが反対票を投じているのを見ます...それはあなたのために機能しませんでしたか?
Nic Sc​​ozzaro、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.