У меня на одной странице два редактора codemirror. Выпадающий список элементов и радиогруппа для выбора нужного редактора.
Что я хочу сделать, так это при изменении раскрывающегося списка вставить значение элемента в целевой редактор (удаленный радиогруппой).
мой код выглядит следующим образом: однако функция не работает. Когда я предупреждаю значение элемента и цель, я получаю ожидаемые результаты, однако функция вставки текста не работает:
<script type = "text/javascript">
function editor(id) {
var editor = CodeMirror.fromTextArea(id, {
continuousScanning: 500,
lineNumbers: true
});
editor.setSize(null, 550);
}
var config_id = document.getElementById('id_config')
var config = editor(config_id);
var remote_config_id = document.getElementById('id_remote_config')
var remote_config = editor(remote_config_id);
function insertStringInTemplate(str, target) {
if (target== "id_config") {
var doc = config
} else {
var doc = remote_config
}
var cursor = doc.getCursor();
var pos = {
line: cursor.line,
ch: cursor.ch
}
doc.replaceRange(str, pos);
}
$(function(){
// bind change event to select
$('#template_vars').on('change', function () {
var var_data = $(this).val(); // get selected value
var var_target = $('input[name=target]:checked').val();
insertStringInTemplate(var_data, var_target)
return false;
});
});
$("#template_vars").chosen({no_results_text: "Oops, nothing found!"});
</script>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


however the function to insert the text is failing
Этот function (т.е. insertStringInTemplate()) работает нормально / правильно; однако проблема связана с функцией editor(), в которой вы забыли вернуть editor (т.е. экземпляр CodeMirror).
Итак, простое исправление:
function editor(id) {
var editor = CodeMirror.fromTextArea(id, {
continuousScanning: 500,
lineNumbers: true
});
editor.setSize(null, 550);
return editor; // <- here's the fix
}
Демо на CodePen.
Однако в этой демонстрации, я добавил блок if к функции insertStringInTemplate(), как в следующем коде:
function insertStringInTemplate(str, target) {
if (target== "id_config") {
var doc = config
} else {
var doc = remote_config
}
// If there's a selection, replace the selection.
if ( doc.somethingSelected() ) {
doc.replaceSelection( str );
return;
}
// Otherwise, we insert at the cursor position.
var cursor = doc.getCursor();
var pos = {
line: cursor.line,
ch: cursor.ch
}
doc.replaceRange(str, pos);
}