2016-08-23 9 views
6

저는 Python 편집기를 사용하고 있으며 CodeMirror 텍스트 영역의 캐럿 위치에 텍스트를 삽입하는 기능을 추가하려고합니다.CodeMirror에서 캐럿에 텍스트 삽입 Textarea

클릭 할 수있는 일련의 그림이 있습니다. 클릭하면 해당 그림의 alt 속성이 저장되고 다시 텍스트 영역 내부를 클릭하면 마우스 위치로 복사됩니다 (데모 바이올린 : https://jsfiddle.net/t0k7yp7n/1/)

다음은 텍스트 삽입 부분에 대한 스크립트입니다. :

var editor; 
 

 
//<![CDATA[ 
 
window.onload = function() { 
 
    editor = CodeMirror.fromTextArea(document.getElementById('textbox'), { 
 
     mode: { 
 
     name: "python", 
 
     version: 2, 
 
     singleLineStringErrors: false 
 
     }, 
 
     lineNumbers: true, 
 
     indentUnit: 4 
 
    }); 
 
    } //]]>
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 

 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script> 
 
    <script src="http://www.skulpt.org/static/skulpt.min.js" type="text/javascript"></script> 
 
    <script src="http://www.skulpt.org/static/skulpt-stdlib.js" type="text/javascript"></script> 
 
    <script src="https://www.cs.princeton.edu/~dp6/CodeMirror/lib/codemirror.js" type="text/javascript"></script> 
 
    <script src="https://www.cs.princeton.edu/~dp6/CodeMirror/mode/python/python.js" type="text/javascript"></script> 
 
    <script src="skulpt-codemirror.js" type="text/javascript"></script> 
 
    <script src="load-save-py.js" type="text/javascript"></script> 
 
    <script src="insert.js" type="text/javascript"></script> 
 
    <link href="https://www.cs.princeton.edu/~dp6/CodeMirror/lib/codemirror.css" rel="stylesheet" type="text/css"> 
 
    <title>Python Editor</title> 
 
</head> 
 

 
<body> 
 
    Filename: 
 
    <input id="inputFileNameToSaveAs"> 
 
    <button onclick="saveTextAsFile()">Save</button> 
 
    <br> 
 
    <input type="file" id="fileToLoad"> 
 
    <button onclick="loadFileAsText()">Open</button> 
 
    <br> 
 
    <br> 
 
    <a href="#!"> 
 
    <img class="insert" alt="#1"> 
 
    <img class="insert" alt="#2"> 
 
    <img class="insert" alt="#3"> 
 
    </a> 
 
    <br> 
 
    <br> 
 
    <textarea id="textbox" name="textbox"></textarea> 
 
    <br> 
 
    <button onclick="runit()" type="button">Run</button> 
 
    <pre id="dynamicframe"></pre> 
 
    <div id="canvas"></div> 
 
</body> 
 

 
</html>

: 여기

selected = ''; 

$('.insert').click(function() { 
    console.log($(this).attr('alt')); 
    selected = $(this).attr('alt'); 
}); 

$('#textbox').click(function() { 
    insertAtCaret('textbox', selected) 
     // Clear the selection so it isn't copied repeatedly 
    selected = ''; 
}); 

function insertAtCaret(areaId, text) { 
    var txtarea = document.getElementById(areaId); 
    var scrollPos = txtarea.scrollTop; 
    var strPos = 0; 
    var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
     "ff" : (document.selection ? "ie" : false)); 
    if (br == "ie") { 
     txtarea.focus(); 
     var range = document.selection.createRange(); 
     range.moveStart('character', -txtarea.value.length); 
     strPos = range.text.length; 
    } else if (br == "ff") strPos = txtarea.selectionStart; 

    var front = (txtarea.value).substring(0, strPos); 
    var back = (txtarea.value).substring(strPos, txtarea.value.length); 
    txtarea.value = front + text + back; 
    strPos = strPos + text.length; 
    if (br == "ie") { 
     txtarea.focus(); 
     var range = document.selection.createRange(); 
     range.moveStart('character', -txtarea.value.length); 
     range.moveStart('character', strPos); 
     range.moveEnd('character', 0); 
     range.select(); 
    } else if (br == "ff") { 
     txtarea.selectionStart = strPos; 
     txtarea.selectionEnd = strPos; 
     txtarea.focus(); 
    } 
    txtarea.scrollTop = scrollPos; 
} 

그리고는 CodeMirror 텍스트 영역 부분입니다

내가 하나의 파일에 함께 넣었을 때 그림을 클릭하면 alt이 텍스트 영역에 복사되지 않습니다. 왜 그런가요? 어떻게 수정합니까?

답변

0

CodeMirror를 사용하는 경우 <textarea />은 CodeMirror에서 제공하는 편집기로 시각적으로 대체되며 <textarea />과 관련된 대부분의 코드는 그대로 사용할 수 없습니다.

실제 배경에있는 <textarea />display: none;으로 표시됩니다. 표시되지 않고 <textarea />에 바인딩 된 이벤트가 실제로 트리거되지 않습니다. 그런 다음 CodeMirror는 자신의 코드를 실제로 DOM에 추가하여 <textarea />의 위치에 새로운 편집기를 표시합니다. 이제는 표시되지 않습니다.

예를 들어, 문자열을 새로 초기화 CodeMirror 편집기의 HTML 코드 '안녕하세요'는 것에 보이는적인 서면 :

<div class="CodeMirror-lines"> 
    <div style="position: relative; outline: none;"> 
     <div class="CodeMirror-measure"> 
      <div style="width: 50px; height: 50px; overflow-x: scroll;"></div> 
     </div> 
     <div class="CodeMirror-measure"></div> 
     <div style="position: relative; z-index: 1;"></div> 
     <div class="CodeMirror-cursors"> 
      <div class="CodeMirror-cursor" style="left: 74px; top: 0px; height: 13px;">&nbsp;</div> 
     </div> 
     <div class="CodeMirror-code"> 
      <div style="position: relative;"> 
       <div class="CodeMirror-gutter-wrapper" style="position: absolute; left: -29px;"> 
        <div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 20px;">1</div> 
       </div><pre><span style="padding-right: 0.1px;"><span class="cm-variable">Hello</span> <span class="cm-variable">World</span></span></pre></div> 
     </div> 
    </div> 
</div> 

당신의 <textarea /> 더 이상 사용되고있다.

CodeMirror는 사용자가 원하는 것을 수행하는 데 사용할 수있는 프로그래밍 API를 기본적으로 제공합니다. 기본적으로 필요한 단계는 다음과 같습니다.

  • 편집기가 포커스를 맞추 었는지 확인하십시오.
  • 초점이 맞춰지면 이전에 클릭 한 사진과 selected 텍스트를 사용할 수 있는지 확인하십시오 (이미지의 alt).
  • 예인 경우 selected 텍스트 (이미지의 alt)를 현재 위치에 삽입하십시오.

    // Listen to the editor focus events. 
    editor.on('focus', function() { 
        // Only insert if a value has been previously selected. 
        if (selected.length > 0) { 
        // Fetch the current CodeMirror document. 
        var doc = editor.getDoc(); 
    
        // Insert the text at the cursor position. 
        doc.replaceSelection(selected); 
    
        // Clear the selection so it isn't copied repeatedly. 
        selected = ''; 
        } 
    }); 
    

    당신은 this JSFiddle에 작업 예제를 확인하실 수 있습니다 :

다음 단계에 관련된 자바 스크립트 코드는 것처럼 보인다.

+0

감사합니다. CodeMirror에 대한 다른 주요 질문이 있습니다. 답변을 원하시면 http://stackoverflow.com/questions/39075483/load-and-save-codemirror-textarea –

+0

이 대답은 괜찮습니까? 나는 그것이 다른 경우에 한 번 살펴볼 것입니다. – HiDeo

+0

예, 고마워요.다른 답변자가 약간의 문제를 겪고 있으므로 조사해 보니 정말 감사 할 것입니다. CodeMirror를 잘 사용하는 방법을 알고 계실 것입니다. –