2016-08-23 2 views
6

Я работаю над редактором Python и хотел бы добавить функцию для вставки текста в положение каретки в текстовое поле CodeMirror.Вставить текст в Caret on CodeMirror Textarea

Существует серия фотографий, которые можно щелкнуть. Когда один щелкают, атрибут этой картины alt будет сохранен, а затем, когда вы снова нажмите внутри текстового поля он получает скопировал на позицию мышей (дема скрипкой: https://jsfiddle.net/t0k7yp7n/1/)

Вот скрипт для вставки текста части :

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 TextArea часть:

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>

Когда я складываю их в один файл, однако, когда я нажимаю на фотографии, их alt s не копируются в текстовое поле. Почему это и как я могу это исправить?

ответ

0

При использовании CodeMirror ваш <textarea /> будет визуально заменен редактором, предоставленным CodeMirror, и большая часть вашего кода относительно вашего <textarea /> не будет использоваться как есть.

Что происходит на заднем плане, так это то, что ваш фактический номер <textarea /> будет сначала отмечен стилем display: none;. Не отображается, никакое событие, связанное с <textarea />, фактически не срабатывает. Затем CodeMirror фактически добавит свой собственный код в DOM, чтобы отобразить новый редактор в позиции вашего <textarea />, который теперь не отображается.

Например, HTML-код для вновь инициализируется редактор CodeMirror со строкой «Hello World», написанный в нем бы не выглядит следующим образом:

<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 изображения) в текущем положении.

код JavaScript, связанный с этими шагами будет выглядеть так:

// 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! –

Смежные вопросы