5

CodeMirror2 の「onPaste」のようなイベントの後に、挿入されたコンテンツをフォーマットすることは可能ですか? - 貼り付け後にクリップボードのコンテンツをインデントしたい。JavaScript ではクリップボードにアクセスできないことは既に知っています。

それで、カット/コピー/ペースト機能を備えたコンテキストメニューを作成する可能性もないと思いますか? - 独自の JS クリップボードを作成できますか、または既存のソリューションはありますか?

ありがとう!レックス

4

4 に答える 4

3

CodeMirror にはネイティブの「inputRead」イベントがあるため、これを行うことができます。

editor.on('inputRead', function(cm, event) {
    /* event -> object{
         origin: string, can be '+input', '+move' or 'paste'
             doc for origins >> http://codemirror.net/doc/manual.html#selection_origin
         from: object {line, ch},
         to: object {line, ch},
         removed: array of removed strings
         text: array of pasted strings
    } */
    if (event.origin == 'paste') {
        console.log(event.text);
        var text = event.text[0]; // pasted string
        var new_text = '['+text+']'; // any operations here
        cm.refresh();
        // my first idea was
        // note: for multiline strings may need more complex calculations
        cm.replaceRange(new_text, event.from, {line: event.from.line, ch: event.from.ch + text.length});
        // first solution did'nt work (before i guess to call refresh) so i tried that way, works too
        /* cm.execCommand('undo');
        cm.setCursor(event.from);
        cm.replaceSelection(new_text); */
    }
});

また、他のイベント「カット」、「コピー」、および「ペースト」( http://codemirror.net/doc/manual.html#events )もあるため、これは機能します。

editor.on('paste', function(cm, event) { ... } );

Andavtage は、event.preventDefault(); を呼び出してイベントをキャンセルできることです。しかし、貼り付けられたテキストを取得するのは問題です。

現在、私は同様のことに取り組んでいます-コピー/貼り付けイベントをフックし、いくつかの置換を行います。プログラムでテキストをクリップボードにコピーする解決策を見つけました。これは ここで議論されているclipboard.jsです . 素晴らしいことは、プログラムでクリック イベントをトリガーできることです (クロス ブラウザー フラッシュ シムで ZeroClipboard を使用したときの問題でした)。

new Clipboard('.btn-copy', {
    text: function(trigger) {
        var text = editor.getValue(); // or editor.getSelection();
        return text.replace(/\s+/g,' ');
    }
});

editor.on('copy', function(cm, event) {
    $('.btn-copy').click();
    event.preventDefault();
});
于 2016-04-03T16:34:55.423 に答える