編集
もっと簡単な方法が存在することに気づきました。以下の方法2をお読みください。古いメソッドとその説明はそのままにして、改善されたjQueryコードを含めるだけです。
パッケージのネイティブメソッドについて質問している場合、答えはノーです。これは。でのみ機能しtextarea
ます。ただし、回避策を使用することに抵抗がない場合は、これが機能する(テスト済み)ものです。
私はここでjQueryを使用しましたが、その使用は必須ではなく、純粋なjsコードでも同じことを実現できますが、jQueryコードほど長く、きれいではありません。
それでは、回避策に取り掛かりましょう。
内部に<pre>
withコードがあり、エディターのない構文で強調表示されたコードミラーコンテナーに変換するとします。
<pre id="mycode">
<?php
echo 'hi';
$a = 10;
if($a == 5) echo 'too small';
?>
</pre>
あなたがしていることは、
- に変更
<pre>
します<textarea>
。
- コードミラーをテキストエリアにアタッチし、
- 偽のカーソルを非表示にして非表示のままにし、
- 非表示のコードミラーのテキストエリアがフォーカスを取得することを許可しないでください(そして、フォーカスを取得したときにそれを取り戻します)。
最後のアクションでは、TravisWebbによって提案された方法を使用しました。これらの4つのことを行うjQueryコードは次のとおりです。
$(document).ready(function() {
// (1) replace pre with textarea
$('#mycode').replaceWith('<textarea id="code">' + $('#mycode').html() + '</textarea>');
// (2) attach codemirror
var editor = CodeMirror.fromTextArea($("#code"), {
lineNumbers: true,
mode: "application/x-httpd-php"
});
// (3) hide the fake cursor
$('pre.CodeMirror-cursor').hide();
// [4] textarea to grab and keep the focus
$('body').append('<textarea id="tricky" style="height: 1px; position: fixed; width: 1px; top: 0; margin-top: -100px;" wrap="off"></textarea>');
// (4) grab focus
$('#tricky').focus();
// [4] if focus is lost (probably to codemirror)
$('#tricky').blur(function() {
// (4) re-claim focus
$('#tricky').focus();
// (3) keep the fake cursor hidden
$('pre.CodeMirror-cursor').hide();
});
});
方法2
カーソルなどと格闘する代わりに、エディターを動かしている要素を削除することができます。コードは次のとおりです。
$(document).ready(function() {
$('#mycode').replaceWith('<textarea id="code">' + $('#mycode').html() + '</textarea>');
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
lineNumbers: true,
mode: "application/x-httpd-php"
});
$('pre.CodeMirror-cursor').remove();
$('div.CodeMirror').find('textarea').blur().parent().remove();
$('div.CodeMirror').find('pre:first').remove();
$('textarea#code').remove();
});