Modifier
Viens de réaliser une méthode plus simple existe. Lire la méthode 2 ci-dessous. Je vais garder l'ancienne méthode et ses explications intacte et il suffit d'inclure l'amélioration de jQuery.
Si vous vous posez des questions à propos d'une méthode native de l'emballage, la réponse est non, il ne fonctionne qu'avec textarea
. Mais si vous êtes ouvert à l'aide de solutions de contournement, en voici un qui fonctionne (testé).
J'ai utilisé jQuery ici, mais son utilisation n'est pas obligatoire et vous pouvez obtenir le même avec de la pure code js, mais ce serait plus long et pas aussi soigné que jQuery.
Maintenant, passons à la solution de contournement.
Supposons que vous avez un <pre>
avec le code à l'intérieur, que vous souhaitez transformer en éditeur-moins de syntaxe en surbrillance codemirror conteneur:
<pre id="mycode">
<?php
echo 'hi';
$a = 10;
if($a == 5) echo 'too small';
?>
</pre>
Ce que vous faites est,
- modifier l'
<pre>
de <textarea>
,
- joindre codemirror pour le textarea,
- masquer les faux curseur et de le garder caché, et
- ne laissez pas le caché codemirror du textarea saisir le focus (et de voler en arrière quand il le fait).
Pour la dernière action que j'ai utilisé la méthode proposée par Travis Webb. Voici le code jQuery qui n'ces quatre choses:
$(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();
});
});
Méthode Deux
Au lieu de lutter avec curseur et tout ça, on peut supprimer les éléments qui permettent à l'éditeur de tique. Voici le code:
$(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();
});