Codemirror 편집기는 클릭 할 때까지 콘텐츠를로드하지 않습니다.


78

에디터를 클릭하고 포커스를받을 때까지 에디터의 설정 값이 에디터에로드되지 않는다는 점을 제외하면 codemirror 2를 사용하고 있습니다.

클릭하지 않고도 편집자가 자신의 내용을 보여 주길 원합니다. 어떤 아이디어?

모든 codemirror 데모가 예상대로 작동하므로 텍스트 영역이 초점이 맞지 않을 수도 있다고 생각하여 시도했습니다.

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

3
모달 팝업에서 CodeMirror 편집기를로드하는이 문제도 있습니다. 편집기를 집중시키는 방법에 대한 해결책을 찾았습니까? 감사.
Ray

답변:


55

setValue () 후에 refresh ()를 호출해야합니다. 그러나 setTimeout을 사용하여 CodeMirror / Browser가 새 콘텐츠에 따라 레이아웃을 업데이트 한 후 refresh ()를 연기해야합니다.

codeMirrorRef.setValue(content);
setTimeout(function() {
    codeMirrorRef.refresh();
},1);

그것은 나를 위해 잘 작동합니다. 여기 에서 답을 찾았습니다 .


1
jQuery UI 탭에서 동일한 문제가 발생했으며 도움이됩니다.
greenif

내가이 답변에 10 번 투표 할 수 있다면. 내 하루를 구했습니다.
jonathana

28

당신 (또는 당신이로드 한 일부 스크립트)이 편집기가 숨겨 지거나 생성 될 때 이상한 위치에있는 방식으로 DOM에 간섭하고 있다고 생각합니다. refresh()표시가 된 후에 는 메서드를 호출해야합니다 .


응답 해 주셔서 감사합니다. 저도 시도해 보겠습니다.

2
내 구현 display: none;에서이 문제를 일으킨 부모 개체가 시작되었습니다. 이 답변은 문제를 쉽게 해결했습니다! 감사합니다, @Marijn!
Soleil

이것은 부모 요소가 자식 표시를 토글하는 GWT TabLayoutPanel 또는 DisclosurePanel 인 내 경우도 해결했습니다. 이 부모 패널에서 리스너를 사용하여 수정하고 표시 할 때 코드 미러 새로 고침을 연기했습니다.
jolivier

28

혹시나 문서를 충분히주의 깊게 읽지 않은 모든 사람들을 위해 (나와 같이)이 문제를 발견했습니다. 이를위한 자동 새로 고침 애드온 이 있습니다.

autorefresh.js파일 에 추가 해야합니다. 이제 이렇게 사용할 수 있습니다.

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

});

매력처럼 작동합니다.


이것은 나를 위해 일했습니다. setTimeout내부에서 실제 시간을 사용 하는 것은 예측할 수 없으며 지금까지 저에게 효과가 있었던 유일한 방법이었습니다. 이 솔루션은 훨씬 더 강력합니다.
intcreator

이것은 단일 setValue ()가있을 때만 작동합니다. 그러나 값을 여러 번 설정하려면 CodeMirror 편집기에 수동으로 초점을 맞춰야합니다.
Chris

@phpheini 나도 같은 문제가 있습니다. 이것을 처리하는 방법을 발견 했습니까?
prismaticorb

나는 실제로 해결책이 없지만 내 경우에는 다른 탭을 사용하여 웹 사이트 콘텐츠를 구성하고 있습니다. 그래서 에디터를 다른 탭에 넣은 다음 사용자가 탭을 변경 codeMirror.refresh()하면 에디터를 새로 고침하는 함수를 호출합니다 .
Chris

이것은 나를 위해 작동하지 않습니다. 자동 새로 고침 플러그인이 작동합니다 (문서 변경시 더 이상 새로 고침을 호출 할 필요가 없음).하지만 편집기 부모가로 시작하면 display: none여전히 편집기를 클릭하여 텍스트를 표시해야합니다
Lewy Blue

10

부트 스트랩 탭에서 CodeMirror를 사용하고 있습니다. 나는 부트 스트랩 탭이 클릭 할 때까지 표시되지 않는 것으로 의심했습니다. 나는 단순히 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));

1
나는 이것을 영원히 찾고 있었다. 감사합니다. CodeMirror 및 부트 스트랩 탭에는 이것이 필요합니다
FilT

5

나를 위해 뭔가 일했습니다.

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

        });

2

5.14.2 버전의 codemirror는 애드온으로이 문제를 완전히 해결합니다. 자세한 내용은 이 답변 을 참조하십시오.


자동 새로 고침 애드온은이 문제를 해결하지 않습니다.
Lewy Blue

1

또 다른 해결책은 (편집기가 제대로 만들기 위해 표시되어야했기 때문에 깨달았습니다) 구성 중에 부모 요소를 body 요소에 일시적으로 연결 한 다음 완료되면 다시 연결하는 것입니다.

이렇게하면 요소를 다루거나 편집기가 묻혀있을 수있는 기존 계층 구조의 가시성에 대해 걱정할 필요가 없습니다.

필자의 경우 processr.com의 경우 여러 개의 중첩 된 코드 편집 요소가 있으며,이 요소는 모두 사용자가 업데이트 할 때 즉석에서 만들어야하므로 다음을 수행합니다.

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

그것은 훌륭하게 작동하며 지금까지 눈에 띄는 깜박임이나 이와 비슷한 것이 없습니다.


1

나는 반응으로 작업하고 있으며 이러한 모든 답변이 저와 함께 작동하지 않았습니다 ... 문서를 읽은 후 다음과 같이 작동했습니다.

생성자에서 Mirror 코드의 인스턴스를 초기화했습니다.

this.mirrorInstance = null;

codeEditor가 포함 된 탭을 열 때 1 millisecocnd 후에 인스턴스를 새로 고쳤습니다.

toggleSubTab() {
    setTimeout(() => {
      this.mirrorInstance.refresh();
    }, 1);
  }

다음은 JSX 코드입니다.

<CodeMirror
           value={this.state.codeEditor}
           options={{
           mode: "htmlmixed",
           theme: "default",
           lineNumbers: true,
           lineWrapping: true,
           autoRefresh: true
           }}
           editorDidMount={editor => {
           this.mirrorInstance = editor;
           }}
        />

0

jQuery 객체 대신 DOM 요소에 포커스를 호출 해보십시오.

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

답변 해 주셔서 감사합니다. 시도해 보겠습니다.
Karl

0

나는 오늘 저녁에이 문제의 버전을 직접 만났다.

많은 다른 게시물은 텍스트 영역 부모의 가시성을 중요하게 여기며, 숨겨져 있으면이 문제에 부딪 힐 수 있습니다.

제 상황에서는 형태 자체와 주변 환경은 괜찮 았지만 렌더링 체인의 상위에있는 Backbone 뷰 관리자가 문제였습니다.

내 뷰 요소는 뷰가 완전히 렌더링 될 때까지 DOM에 배치되지 않으므로 DOM에없는 요소는 숨겨진 것으로 간주되거나 처리되지 않은 것으로 간주됩니다.

이를 해결하기 위해 렌더링 후 단계 (의사 코드)를 추가했습니다.

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

postRender에서 뷰는 이제 모든 콘텐츠가 화면에 표시된다는 것을 알고 필요한 작업을 수행 할 수 있습니다. 여기에서 CodeMirror를 이동했고 제대로 작동했습니다.

이것은 또한 어떤 경우에는 표시하기 전에 모든 콘텐츠를 빌드하려고 시도 할 수 있으므로 팝업과 같은 문제가 발생하는 이유를 설명하는 방법 중 하나가 될 수 있습니다.

누군가에게 도움이되기를 바랍니다.

남자 이름


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

0

뭔가 효과가 있었어! :)

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

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

0

새로 고침 도움말을 사용하여이 문제를 해결하십시오. 하지만 우호적이지 않은 것 같습니다


0

이유:

CodeMirror는 DOM 노드가 보이지 않을 때 DOM 콘텐츠를 업데이트하지 않습니다.

예를 들면 :

CodeMirror의 Dom 스타일이 ' display : none으로 설정된 경우 '으로 설정 .

해결 방법 :

CodeMirror의 Dom이 표시되면 수동으로 cm.refresh()메서드를 실행합니다 .

예를 들어 내 응용 프로그램에서 탭 요소를 클릭하면 CodeMirror Dom이 표시됩니다.

따라서 간단한 방법은 다음과 같습니다.

window.onclick = () => {
    setTimeout(() => {
        codeMirrorRef.refresh();
    }, 10);
};

보다 구체적인 요소에 이벤트 리스너를 추가하여 성능을 향상시킬 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.