Googleが何千回もGoogleで検索しました。デフォルトではプレーンテキストでTinymceを貼り付け、「テキストとして貼り付け」ボタンをクリックせずにフォーマットを削除する方法の完全なソリューションはありません。
それを実装する方法のアイデアはありますか?または「テキストとして貼り付け」ボタンを自動的に有効にする方法は?
ありがとうございました
編集:このソリューションはバージョン3.x向けです。4.xバージョンについては@Paulo Nevesから回答をお読みください
問題は、Pasteプラグインがすべての貼り付けでプレーンテキストの貼り付けを自動的にリセットすることです。必要なことはすべて、元に戻します。次のコードが役立ちます。
tinyMCE.init({
...
oninit : "setPlainText",
plugins : "paste"
....
});
SetPlainTextの定義
function setPlainText() {
var ed = tinyMCE.get('Elm1');
ed.pasteAsPlainText = true;
//adding handlers crossbrowser
if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
ed.onKeyDown.add(function (ed, e) {
if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
ed.pasteAsPlainText = true;
});
} else {
ed.onPaste.addToTop(function (ed, e) {
ed.pasteAsPlainText = true;
});
}
}
そのため、今では常にわかりやすくなります。
TinyMCE 3Xまたは4Xの場合、状況は少し変わりました。これで、これを実行でき、正常に動作します。
tinymce.init({
plugins: "paste",
paste_as_text: true
});
私はこのコードでこの問題を解決しました
tinyMCE.init({
...
plugins : "paste",
paste_text_sticky : true,
setup : function(ed) {
ed.onInit.add(function(ed) {
ed.pasteAsPlainText = true;
});
}
....
})
自分でこれに遭遇し、TinyMCE 3.4.2の時点で簡単にできることを発見しました:
paste_text_sticky: true,
paste_text_sticky_default: true
...すてきでした。
最も簡単な方法はこれだと思います:
tinymce.init({
...
paste_as_text: true,
plugins: "paste",
...
});
何らかの理由でプラグインを使用できない、または使用したくない場合は、次のような独自の「プレーンテキストとして貼り付け」コールバック関数を作成できます。
tinyMCE.init({
// ...,
setup: function (editor) {
// Listen for paste event, add "Paste as plain text" callback
editor.onPaste.add(function (editor, e) {
// Prevent default paste behavior
e.preventDefault();
// Check for clipboard data in various places for cross-browser compatibility.
// Get that data as text.
var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
// Let TinyMCE do the heavy lifting for inserting that content into the editor.
editor.execCommand('mceInsertContent', false, content);
});
}
});
注:これはTinyMCE 3.5.x用に作成されました。互換性はバージョンによって異なる場合があります。
参考までに、TinyMCEは貼り付けプラグインのデフォルトオプションとして実装することでこれを改善しました。詳細: http://www.tinymce.com/wiki.php/Plugin:paste
ただし、まだ完全ではありません。したがって、すべてのHTMLを削除するスクリプトもあります。
// Paste
paste_auto_cleanup_on_paste : true,
paste_remove_spans: true,
paste_remove_styles: true,
paste_retain_style_properties: false,
paste_preprocess : function(pl, o)
{ // Replace <div> with <p>
o.content = o.content.replace(/<div>/gi, "<p>");
o.content = o.content.replace(/<\/div>/gi, "</p>");
o.content = o.content.replace(/<\r\n/gi, "\n");
o.content = o.content.replace(/<\n\n/gi, "\n");
o.content = o.content.replace(/<\n\n/gi, "\n");
// Replace empty styles
o.content = o.content.replace(/<style><\/style>/gi, "");
o.wordContent = true;
},
paste_postprocess : function(pl, o)
{ //console.log(o.node.innerHTML);
var ed = pl.editor, dom = ed.dom;
// Remove all tags which are not <p> or <br>
tinymce.each(dom.select('*', o.node), function(el)
{ if (el.tagName.toLowerCase() != "p" && el.tagName.toLowerCase() != "br")
{ dom.remove(el, 1); // 1 = KeepChildren
console.log(el.tagName);
}
dom.setAttrib(el, 'style', '');
});
},
ソース: http://www.tinymce.com/forum/viewtopic.php?pid=60121#p60121
使用する方が良いですか?
var ed = tinyMCE.activeEditor;
の代わりに:
var ed = tinyMCE.get('Elm1');
私は次のようにしました:
var pastePlainText = function() {
// No need to pass in an ID, instead fetch the first tinyMCE instance
var ed = tinyMCE.get(0);
ed.pasteAsPlainText = true;
//adding handlers crossbrowser
if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
ed.onKeyDown.add(function (ed, e) {
if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
ed.pasteAsPlainText = true;
});
} else {
ed.onPaste.addToTop(function (ed, e) {
ed.pasteAsPlainText = true;
});
}
};
その後:
tinyMCE.init({
// ...
plugins: "paste",
oninit: pastePlainText // Note, without "
// ...
})