Редактор Codemirror не загружает содержимое до щелчка


Я использую codemirror 2 и его работу нормально, за исключением того, что заданное значение редактора Не загружается в Редактор, пока я не нажму на редактор, и он станет сфокусированным.

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

все демо-версии codemirror работают так, как ожидалось, поэтому я решил, что текстовая область не сфокусирована, поэтому я тоже попробовал.

$("#editor").focus();
var editor =    CodeMirror.fromTextArea(document.getElementById("editor"), {
                    mode: "text/html",
                    height: "197px",
                    lineNumbers: true
                });
11 65

11 ответов:

вы должны вызвать refresh () после setValue (). Однако вы должны использовать setTimeout, чтобы отложить обновление () до после того, как CodeMirror / Browser обновил макет в соответствии с новым контентом:

this.codeMirrorInstance.setValue(content);
var that = this;
setTimeout(function() {
    that.codeMirrorInstance.refresh();
},1);

это хорошо работает для меня. Я нашел ответ в здесь.

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

на всякий случай, и для всех, кто не читает документацию достаточно внимательно (как я), но натыкается на это. Там есть автообновление аддон только для этого.

вам нужно добавить autorefresh.js в свой файл. Теперь вы можете использовать его вот так.

var editor = CodeMirror.fromTextArea(document.getElementById("id_commentsHint"), {
  mode: "javascript",
  autoRefresh:true,
  lineNumbers: false,
  lineWrapping: true,

});

работает как шарм.

Я с помощью CodeMirror в разделе Загрузки. Я подозревал, что вкладки bootstrap были тем, что мешало ему появляться до щелчка. Я исправил это, просто позвонив refresh() метод на шоу.

var cmInstance = CodeMirror.fromTextArea(document.getElementById('cm'), {
    lineNumbers: true,
    lineWrapping: true,
    indentUnit: 4,
    mode: 'css'
});

// to fix code mirror not showing up until clicked
$(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function() {
    this.refresh();
}.bind(cmInstance));

что-то сработало для меня.

$(document).ready(function(){
                var editor = CodeMirror.fromTextArea(document.getElementById("code2"), {
                     //lineNumbers: true,
                      readOnly: true,
                      autofocus: true,
                     matchBrackets: true,
                     styleActiveLine: true
                 });
                 setTimeout(function() {
                     editor.refresh();
                    }, 100);

        });

версия 5.14.2 codemirror обращается к этому полностью с добавлением. Смотрите ответ для сведения.

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

таким образом, вам не нужно вмешиваться в элементы или беспокоиться о видимости в любых существующих иерархиях, которые могут быть похоронены вашим редактором.

в моем случае, для processr.com, у меня есть несколько вложенных элементов редактирования кода, все из которых должны быть созданы "на лету", когда пользователь делает обновления, поэтому я делаю следующее:

this.$elements.appendTo('body');
for (var i = 0; i < data.length; i++)
{
    this.addElement(data[i]);
}
this.$elements.appendTo(this.$view);

он отлично работает, и до сих пор не было никакого видимого мерцания или чего-то подобного.

что-то сработало для меня! :)

      var sh = setInterval(function() {
       agentConfigEditor.refresh();
      }, 500); 

      setTimeout(function(){
        clearInterval(sh);  
      },2000)

попробуйте вызвать фокус на элементе DOM вместо объекта jQuery.

var editor=$( '#editor' );
editor[0].focus();
// or
document.getElementById( 'editor' ).focus();

Я просто столкнулся с версией этой проблемы сам сегодня вечером.

ряд других сообщений считают видимость родителя textarea важной, если она скрыта, то вы можете столкнуться с этой проблемой.

в моей ситуации сама форма и непосредственное окружение были прекрасны, но мой менеджер Backbone view выше по цепочке рендеринга был проблемой.

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

чтобы обойти это, я добавил фазу пост-рендеринга (псевдокод):

view.render();
$('body').html(view.el);
view.postRender();

в postRender вид может делать то, что ему нужно, зная, что все содержимое теперь видно на экране, вот где я переместил CodeMirror, и он работал нормально.

Это также может пойти некоторым образом, чтобы объяснить также, почему можно столкнуться с проблемами с такими вещами, как всплывающие окна, как в некоторых случаях они могут попытаться построить все содержимое перед отображением.

надеюсь, что это кому-то поможет.

Тоби

<div class="tabbable-line">
    <ul class="nav nav-tabs">
        <li class="active">
            <a href="#tabXml1" data-toggle="tab" aria-expanded="true">Xml 1</a>
        </li>
        <li class="">
            <a href="#tabXml2" id="xmlTab2Header" data-toggle="tab" aria-expanded="true">Xml 2</a>
        </li>
    </ul>
    <div class="tab-content">
        <div class="tab-pane active" id="tabXml1">
            <textarea id="txtXml1" />
        </div>
        <div class="tab-pane" id="tabXml2">
            <textarea id="txtXml2" />
        </div>
    </div>
</div>

<link rel="stylesheet" href="~/Content/codemirror.min.css">
<style type="text/css">
    .CodeMirror {
        border: 1px solid #eee;
        max-width: 100%;
        height: 400px;
    }
</style>

<script src="~/Scripts/codemirror.min.js"></script>
<script src="~/Scripts/codemirror.xml.min.js"></script>
<script>
        $(document).ready(function () {
            var cmXml1;
            var cmXml2;
            cmXml1 = CodeMirror.fromTextArea(document.getElementById("txtXml1"), {
                mode: "xml",
                lineNumbers: true
            });
            cmXml2 = CodeMirror.fromTextArea(document.getElementById("txtXml2"), {
                mode: "xml",
                lineNumbers: true
            });
            // Refresh code mirror element when tab header is clicked.
            $("#xmlTab2Header").click(function () {
                setTimeout(function () {
                    cmXml2.refresh();
                }, 10);
            });
        });
</script>