Làm cách nào để biến một textarea thành một trình soạn thảo ACE?


96

Tôi muốn có thể chuyển đổi các textareas cụ thể trên một trang thành ACE biên tập viên.

Có ai có bất kỳ chỉ dẫn xin vui lòng?

BIÊN TẬP:

Tôi có tệp editor.html hoạt động với một vùng văn bản, nhưng ngay sau khi tôi thêm một giây, tệp thứ hai sẽ không được chuyển đổi thành một trình chỉnh sửa.

CHỈNH SỬA 2:

Tôi quyết định loại bỏ ý tưởng có một số và thay vào đó mở một trong một cửa sổ mới. Khó khăn mới của tôi là khi tôi ẩn () và hiển thị () vùng văn bản, màn hình bị lỗi. Bất kỳ ý tưởng?


1
Anh chàng này có một giải pháp tuyệt vời khá: gist.github.com/duncansmart/5267653
billynoah

Câu trả lời:


159

Theo như tôi hiểu ý tưởng về Ace, bạn không nên biến một textarea thành một trình soạn thảo Ace. Thay vào đó, bạn nên tạo một div bổ sung và cập nhật textarea bằng cách sử dụng hàm .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());
});

hoặc chỉ cần gọi

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

chỉ khi bạn gửi biểu mẫu với vùng văn bản nhất định. Tôi không chắc liệu đây có phải là cách phù hợp để sử dụng Ace hay không, nhưng đó là cách nó được sử dụng trên GitHub .


1
Giá trị textarea chỉ nên được cập nhật trên sự kiện form.submit không? Ngoài ra, theo điều này: groups.google.com/group/ace-discuss/browse_thread/thread/… Không có hỗ trợ thay thế textarea. Câu trả lời của bạn sau đó là một trong những tốt. Cám ơn.
Damien

4
Đôi khi bạn cần cập nhật giá trị vùng văn bản khi đang di chuyển, chẳng hạn như để triển khai tính năng tự động lưu bản nháp hoặc lâu hơn thế.
installero

Tôi gặp sự cố với phương pháp này: nhắn tin 'CHỌN 1 HOẶC 2;' trên ace.editor sẽ đưa 'SELECT&nbsp;1OR&nbps;2;'vào textarea. Ai đó có thể cho tôi biết tôi đang làm gì sai không?
alexglue

alexglue, bạn đã đặt khoảng trắng: nowrap trên textarea của mình chưa? github.com/ajaxorg/ace/issues/900
installero

Installero, tôi không có thuộc tính css này trên textarea của mình. Vì vậy, không, tôi đã không.
alexglue

33

Duncansmart có một giải pháp khá tuyệt vời trên trang github của mình, progressive-ace , giải pháp này thể hiện một cách đơn giản để kết nối trình chỉnh sửa ACE với trang của bạn.

Về cơ bản, chúng tôi lấy tất cả các <textarea>phần tử có data-editorthuộc tính và chuyển đổi mỗi phần tử thành một trình chỉnh sửa ACE. Ví dụ này cũng đặt một số thuộc tính mà bạn nên tùy chỉnh theo ý thích của mình và trình bày cách bạn có thể sử dụng datacác thuộc tính để đặt thuộc tính cho mỗi phần tử như hiển thị và ẩn máng xối 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
Rất khuyến khích. Rất linh hoạt và sạch sẽ!
aaandre

5
Sửa đổi duy nhất mà tôi đã thực hiện đối với mã trên là thay đổi textarea.css ('khả năng hiển thị', 'ẩn'); thành textarea.css ('display', 'none'); nếu không tôi đã nhận được thêm không gian trống trên màn hình
Nick Goloborodko

@NickGoloborodko - trễ vài năm ở đây nhưng tôi đồng ý và tôi đã cập nhật câu trả lời cho phù hợp. Ngoài ra, hãy sửa liên kết ace để đoạn mã hoạt động trở lại.
billynoah

@billynoah Tôi đã sử dụng mã này nhưng Những gì tôi có là một khoảng trống không thể chỉnh sửa được, làm cách nào để tôi có thể sửa lỗi này? Cảm ơn
bleyk

không có ý kiến, rõ ràng là bạn đã không sử dụng mã này chính xác như nó vốn có hoặc nó sẽ hoạt động - giống như đoạn mã. nếu bạn cần trợ giúp gỡ lỗi, bạn nên bắt đầu một câu hỏi mới.
billynoah 14/02/18

8

Bạn có thể có nhiều Biên tập viên Ace. Chỉ cần cung cấp cho mỗi vùng văn bản một ID và tạo Ace Editor cho cả hai IDS như sau:

<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

Để tạo một trình chỉnh sửa chỉ cần làm:

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

Chúng phải được định vị và kích thước rõ ràng. Bằng show () và hide (), tôi tin rằng bạn đang đề cập đến các hàm jQuery. Tôi không chắc chính xác cách họ thực hiện, nhưng nó không thể sửa đổi không gian mà nó chiếm trong DOM. Tôi ẩn và hiển thị bằng cách sử dụng:

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

Nếu bạn sử dụng thuộc tính css 'display', nó sẽ không hoạt động.

Xem wiki ở đây để biết cách thêm chủ đề, chế độ, v.v. ... https://github.com/ajaxorg/ace/wiki/Embedding---API

Lưu ý: chúng không nhất thiết phải là textareas, chúng có thể là bất kỳ phần tử nào bạn muốn.


8
Ngoại trừ, không. Nếu bạn gọi, ace.edit('code1')bạn sẽ nhận được rác như: <textarea class="ace_editor ace-twilight ace_focus"><div class="ace_gutter">...</textarea>Trong các từ khóa khác, ace.edit cố gắng tự nhét vào bên trong textarea và điều này không hay lắm.
Ciantic

0

Đối với bất kỳ ai như tôi chỉ muốn một ví dụ tối thiểu, hiệu quả về việc sử dụng Ace từ 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>


Tôi thấy ai đó đã phản đối ... nó không hoạt động với bạn?
Nic Scozzaro,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.