Редактор Codemirror не загружает содержимое до щелчка
Я использую codemirror 2 и его работу нормально, за исключением того, что заданное значение редактора Не загружается в Редактор, пока я не нажму на редактор, и он станет сфокусированным.
Я хочу, чтобы редактор показывал содержимое самого себя, не нажимая на него. Есть идеи?
все демо-версии codemirror работают так, как ожидалось, поэтому я решил, что текстовая область не сфокусирована, поэтому я тоже попробовал.
$("#editor").focus();
var editor = CodeMirror.fromTextArea(document.getElementById("editor"), {
mode: "text/html",
height: "197px",
lineNumbers: true
});
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>