Автоматическая настройка высоты содержимого в редакторе Ace Cloud 9

Я пытаюсь добавить редактор Ace на страницу, но я не знаю, как установить высоту автоматически на основе длины его содержимого.

В идеале это сработает, когда содержимое изменит высоту, будет пересчитано, но я был бы доволен высотой, просто устанавливаемой при загрузке страницы.

Для новичков JavaScript кто-то может помочь мне разобраться, как я определяю длину кода, сколько строк он охватывает, какова новая высота и как я обновляю DOM, чтобы отразить это?

Я нашел это предложение в группе Google, но я действительно не понимаю, что он делает, и как я могу настроить его высота.

editor.getSession().getDocument().getLength() *
editor.renderer.lineHeight + editor.renderer.scrollBar.getWidth()

Ответ 1

(ОБНОВЛЕНИЕ: Я сейчас не работаю с этим, но мой ответ может быть устаревшим. Чтобы попытаться включить то, что предоставили другие, я расскажу им об упоминании свойств minLines и maxLines, например

editor.setOptions({
    maxLines: Infinity
});

По-видимому, бесконечность - "не очень хорошая идея, так как она отключит виртуальный видоискатель даже для очень больших документов". Таким образом, выбор лимита может быть лучше.

Для истории, старый ответ был:


Сообщение, которое вы цитируете, работает только при условии, что это шрифт фиксированной ширины, высота символа которого вы знаете, и что вы знаете количество строк в документе. Умножьте, что вместе вы получите количество пикселей для того, насколько высок контент. Предполагается, что каждый раз, когда нажимается символ или вырезается/вставляется (что может добавлять или удалять строки), вы используете JavaScript для применения этого конкретного нового размера к элементам вашего DOM с стилями CSS.

(Они вбрасывают "ширину" полосы прокрутки в расчет высоты, и я честно не могу сказать вам, есть ли обоснование этого или нет. Я позволю кому-то еще понять эту часть.)

Во всяком случае... если у вас есть мягкая обертка, количество отображаемых строк экрана может быть больше, чем количество "реальных" строк в документе. Поэтому лучше использовать editor.getSession().getScreenLength(), чем editor.getSession().getDocument().getLength().

Я помещаю редактор (положение: абсолютный) внутри секции (позиция: относительный), и это единственный элемент, живущий в этом разделе. Этот код, по-видимому, сейчас работает для меня, я обновлю его, если узнаю больше...!

(Примечание. Мое общее понимание кода, представленного в StackOverflow, заключается в том, что мы не собираемся завершаться в 8-строчном ядре Oracle против Google., и вы можете использовать по своему усмотрению. Но поскольку я был отправлен по электронной почте об этом, в частности, я добавил явный менее строгий лицензионный термин для этих подобных незначительных строк.: -P)

// The following code snippet is released under the MIT license,
// -or- FreeBSD license, -or- an unrestrictive license of your
// choice including CC-ZERO or public domain.
//
// (those are GPL and Apache compatible, in any case)
//
// http://en.wikipedia.org/wiki/MIT_License
// http://en.wikipedia.org/wiki/BSD_licenses

$(document).ready(function(){

    var heightUpdateFunction = function() {

        // http://stackoverflow.com/questions/11584061/
        var newHeight =
                  editor.getSession().getScreenLength()
                  * editor.renderer.lineHeight
                  + editor.renderer.scrollBar.getWidth();

        $('#editor').height(newHeight.toString() + "px");
        $('#editor-section').height(newHeight.toString() + "px");

        // This call is required for the editor to fix all of
        // its inner structure for adapting to a change in size
        editor.resize();
    };

    // Set initial size to match initial content
    heightUpdateFunction();

    // Whenever a change happens inside the ACE editor, update
    // the size again
    editor.getSession().on('change', heightUpdateFunction);
}

Ответ 2

Ace предоставляет возможность: maxLines, чтобы вы могли просто попробовать:

editor.setOptions({
    maxLines: 15
});

http://jsfiddle.net/cirosantilli/9xdkszbz/

Ответ 3

Обновление: см. Dickeylth answer. Это все еще работает (и люди по-прежнему считают это полезным), но базовые функции теперь встроены в ACE.


Чтобы "автоматически регулировать высоту до содержимого в редакторе Ace Cloud9", вам просто нужно изменить размер редактора, чтобы он соответствовал содержащему его элементу, всякий раз, когда содержимое редактируется. Предполагая, что вы начали с <div id=editor>...

var editor = ace.edit("editor");                   // the editor object
var editorDiv = document.getElementById("editor");     // its container
var doc = editor.getSession().getDocument();  // a reference to the doc

editor.on("change", function() {
    var lineHeight = editor.renderer.lineHeight;
    editorDiv.style.height = lineHeight * doc.getLength() + "px";
    editor.resize();
});

Вы изменяете размер div, в котором живет редактор, затем звоните editor.resize, чтобы заставить редактор пополнить div.

Если вы вставляете контент в длинные строки, с ACE, установленным для обертывания строк, количество новых строк и фактических строк будет отличаться, поэтому редактор будет прокручиваться. Этот код исправит это, но вместо этого вы получите горизонтальную прокрутку.

editor.getSession().setUseWrapMode(false)

Ответ 4

Я думаю, что решение может рассчитывать количество строк в редакторе, а затем изменять его размер в соответствии с этими строками:

editor.setOptions({
     maxLines: editor.session.getLength()
});

Надеюсь, что это поможет.

Ответ 5

Я согласен с принятым ответом, за исключением того, что я бы предпочел editor.getSession().getScreenLength().

Проблема заключается в том, что если вы включаете режим обхода, длинная строка может разбиться на несколько строк. Таким образом, вы не сможете получить правильный счетчик строк с помощью editor.getSession().getDocument().getLength().

Ответ 6

Вы можете использовать jQuery:

 var length_editor = editor.session.getLength();
 var rows_editor = length_editor * 17;

 $('#editor').css('height',rows_editor);

Ответ 7

Мой метод в чистом JavaScript (замените editor-container на правильный id).

function adaptEditor() {
    document.getElementById('editor-container').style.height = window.innerHeight + 'px';
    editor.resize();
}
window.onresize = function(event) {
    adaptEditor();
};
adaptEditor();

Ответ 8

Этот вариант работает лучше для меня, поскольку иногда редактор .renderer.lineHeight возвращает 1

    var resize = function() {
     var minHt = 16;
     var sl = editor.getSession().getScreenLength();
     var sw = editor.renderer.scrollBar.getWidth();
     var lh = Math.max(editor.renderer.lineHeight, minHt);
     var ht = Math.max(((sl * lh) + sw), minHt);
     $('#myEditorDiv').height(ht);
     editor.resize();
   };