2012-02-29 16 views
4

、私は(getRange()、 アンドゥを見つける)、など)(やり直し、と私はカット見つけることができません()、コピー()とペーストAPI、 とより多くの私はeditor.execCommand("cut")を実行しようとすると、私を得ますエラー。 私を助けることができますか?ありがとう!codemerrorはCut、Copy、Paste APIを提供していますか? <a href="http://codemirror.net/doc/manual.html" rel="nofollow">http://codemirror.net/doc/manual.html</a>から

+0

いいえ、それはありません。 – Hoque

+0

http://stackoverflow.com/questions/13929371/copy-and-paste-in-codemirror-js-embeded-in-javafx-application –

答えて

2

カット/コピー/ペースト用のCodeMirror APIはありません。これは、ブラウザのセキュリティ制限により、JavaScriptがプログラムによってクリップボードにアクセスすることが禁止されているためです。ペーストはプライベートデータを盗むために使用され、カット/コピーはmore elaborate attack vectorとして使用できます。

ブラウザの独自のネイティブコードがユーザーのみ、現在選択しているテキストや集中テキストフィールドに基づいて、クリップボード(キーボードショートカットやコンテキストメニュー項目)にアクセスジェスチャーを処理します。

This SO threadには、これらの制限を回避するための試行の概要があります。 CodeMirrorのアプローチは、最初の弾丸です。ユーザーのクリップボードジェスチャーが確実に機能するように非表示のテキストエリアを使用しますが、それでもプログラマティックなAPIはサポートしていません。

ただし、です。部分的な回避策:小さなFlashウィジェットを使用してください(これは上記のスレッドの2番目の箇条書きです)。 Flash relaxes the restrictionsをコピー/カット(貼り付けはしません)してください。それでもユーザイベントによってトリガされなければなりませんが、HTML UIのボタンをクリックするようなものかもしれません。 ZeroClipboardClippyのようなラッパーは、Flashを知らなくてもこれらの機能に簡単にアクセスできます。コピーするときにCodeMirrorから適切な文字列を引き出すために小さなグルーコードを書く必要がありますが、それほど悪くはありません。

+0

残念ながら、CodeMirrorはAndroid/Chromeとうまく連携していないようです。具体的には、選択するロングタップが機能しないため、テキストをコピーすることはできません。 – Michael

7

clipboard.jsを使用すると、text()関数を定義してCodeMirrorの内部ドキュメントの値を取得できます。

便宜上、(<textarea>)エディタのセレクタへの参照を保存してください。

var editorSelector = '#editor' // or '#editor + .CodeMirror'; 

ボタンを参照して新しいClipBoardオブジェクトをインスタンス化します。

new Clipboard('.clip-btn-native', { 
    text: function(trigger) { 
     return getCodeMirrorNative(editorSelector).getDoc().getValue(); 
    } 
}); 

CodeMirrorネイティブJavaScriptを使用してインスタンスを取得します。

function getCodeMirrorNative(target) { 
    var _target = target; 
    if (typeof _target === 'string') { 
     _target = document.querySelector(_target); 
    } 
    if (_target === null || !_target.tagName === undefined) { 
     throw new Error('Element does not reference a CodeMirror instance.'); 
    } 

    if (_target.className.indexOf('CodeMirror') > -1) { 
     return _target.CodeMirror; 
    } 

    if (_target.tagName === 'TEXTAREA') { 
     return _target.nextSibling.CodeMirror; 
    } 

    return null; 
}; 

デモ

完全な参照してください。詳細なデモはJSFiddleです。

関連する問題