Standardmäßig wird Tinymce im Klartext eingefügt

103

Tausende Male gegoogelt, gibt niemand eine vollständige Lösung, wie Tinymce standardmäßig in Klartext eingefügt und Formatierungen entfernt werden können, ohne auf die Schaltfläche "Als Text einfügen" zu klicken.

Irgendwelche Ideen, wie man das umsetzt? oder wie man die Schaltfläche "Als Text einfügen" automatisch aktiviert?

Danke dir

Ryan
quelle

Antworten:

59

BEARBEITEN: Diese Lösung ist für Version 3.x, für Version 4.x lesen Sie die Antwort von @Paulo Neves

Das Problem ist, dass das Einfügen-Plugin das Einfügen von einfachem Text bei jedem Einfügen automatisch zurücksetzt. Also alles was wir tun müssen - es zurücksetzen. Der folgende Code sollte helfen.

tinyMCE.init({
...
oninit : "setPlainText",
plugins : "paste"

....
});

Die Definition von 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;
            });
        }
    }

So, jetzt wird es immer klar sein.

er-v
quelle
Ich denke, es liegt an dem fehlenden Paste-Plugin, das ich erstellt habe. Schauen Sie sich das an. 92.248.232.12/tinymce/examples/simple.html tinyMCE.init ({... oninit: "setPlainText", Plugins: "paste". ..});
er-v
5
Tolle Antwort, obwohl ich festgestellt habe, dass ich JS-Fehler in Bezug auf die Definition von "ed" bekomme. Dies war einfach zu beheben, indem einfach die Zeile tinyMCE.get ("elm1") entfernt und ed als erster Parameter der setPlainText-Methode eingefügt wurde: z. B. "function setPlainText (ed) {...".
Drmonkeyninja
8
In späteren Versionen von tinymce wurden einige Optionen hinzugefügt, um dies zu beheben. paste_text_sticky_default: trueund paste_text_sticky: truein Ihrer Konfiguration sollte der Trick tun. (Ich benutze 3.5.0.1)
Greg
@ er-v Vorschläge, wie die mit tinyMCE formatierte Zeichenfolge mithilfe eines Formulars beibehalten werden kann
codeObserver
13
Gerade ausprobiert .init({ plugins: ["paste"], paste_as_text: true }), und es funktioniert wie ein Zauber mit TinyMCE 4.1, ohne dass eine zusätzliche Funktion erforderlich ist.
Rémi Breton
149

Für den tinyMCE 3X oder 4X haben sich die Dinge ein wenig geändert. Jetzt können Sie dies tun und es funktioniert gut.

tinymce.init({
    plugins: "paste",
    paste_as_text: true
});
Paulo Almeida
quelle
5
Ja, die anderen Ansätze haben nicht funktioniert, aber das funktioniert.
Tim
2
@Tim Der in der Antwort auf diese Frage gezeigte Ansatz ist spezifisch für TinyMCE 3.x. Wenn Sie TinyMCE 4 oder höher verwenden, reicht der Ansatz in dieser Antwort aus.
Leonardo Montenegro
Es gibt ein Plugin oder eine Option für fast alles in TinyMCE. Kein Wunder, dass es das Beste ist!
Supersan
1
Vielen Dank für die Lösung, aber das bedeutet eigentlich, dass ich daran denken muss, die Konfigurationsdatei jedes Mal zu bearbeiten, wenn die Plugins aktualisiert wurden.
Mike
84

Ich habe dieses Problem mit diesem Code gelöst

tinyMCE.init({
...
plugins : "paste",
paste_text_sticky : true,
setup : function(ed) {
    ed.onInit.add(function(ed) {
      ed.pasteAsPlainText = true;
    });
  }
....
})
Dariusz Lyson
quelle
11
Für das, was es wert ist, denke ich, dass Ihre Lösung besser ist als die ausgewählte Antwort.
Arikfr
@Dariusz Lyson, irgendwelche Vorschläge, wie die mit tinyMCE formatierte Zeichenfolge mithilfe eines Formulars beibehalten werden kann? : stackoverflow.com/questions/17247900/…
codeObserver
9
Ich erhalte einen Javascript-Fehler, dessen onInitEigenschaft edundefiniert ist. Unable to get property 'add' of undefined or null reference
Tim
35

Ich bin gerade auf diesen gestoßen und habe festgestellt, dass Sie ab TinyMCE 3.4.2 einfach:

paste_text_sticky: true,
paste_text_sticky_default: true

... was schön war.

stovroz
quelle
2
+1 für diese Konfigurationsoptionen, vergessen Sie nicht, das Einfüge-Plugin zum Plugin-Array hinzuzufügen!
Fredszaq
3
Der Editor erlaubt weiterhin das Einfügen von anderem als einfachem Text, wenn ich diesen Ansatz verwende.
Tim
7

Ich denke, der einfachste Weg wäre folgender:

tinymce.init({
   ...
   paste_as_text: true,
   plugins: "paste",
   ...
});
Brüder28
quelle
1

Ist es nicht besser zu benutzen:

var ed = tinyMCE.activeEditor;

anstatt:

var ed = tinyMCE.get('elm1');
Asen Mitov
quelle
Ich bin damit einverstanden, dass ich mein Skript mit activeEditor anstelle von get ('elm1') zum Laufen bringen konnte. Außerdem habe ich in meiner Antwort Ihren Code + Code als Antwort akzeptiert und es funktioniert hervorragend
GibboK
Dies ist ein Kommentar, der auf die Antwort von er-v gerichtet ist . Dies gibt keine Antwort auf die Frage. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren .
Alle Arbeiter sind wesentlich
1

Zu Ihrer Information, TinyMCE hat dies verbessert, indem es als Standardoption im Einfüge-Plugin implementiert wurde. Weitere Informationen: http://www.tinymce.com/wiki.php/Plugin:paste

Es ist jedoch immer noch nicht perfekt. Hier ist also ein Skript, das auch den gesamten HTML-Code auslöst:

// 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', '');
            });

        },

Quelle: http://www.tinymce.com/forum/viewtopic.php?pid=60121#p60121

laarsk
quelle
1

Ohne Plug-In: Hören Sie sich das Einfügen eines Ereignisses an und rufen Sie die Daten der Zwischenablage ab

Wenn Sie ein Plug-In aus irgendeinem Grund nicht verwenden können oder möchten, können Sie Ihre eigene Rückruffunktion "Als einfachen Text einfügen" wie folgt erstellen:

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);
        });
    }
});

Hinweis: Dies wurde für TinyMCE 3.5.x erstellt. Die Kompatibilität kann je nach Version variieren.

Gfullam
quelle
1
Ausgezeichnete Lösung für 3.x - keine der anderen Antworten funktionierte in meinem Fall
Rolf Pedro Ernst
1

Wenn Sie eine .yml-Datei verwenden, fügen Sie das Plugin pasteund hinzupaste_as_text: true

default:
  plugins:
    - paste
  paste_as_text: true
LifterCoder
quelle
-1

Ich bin mir nicht sicher, ob dies möglich ist, da "Einfügen als Klartext" den Text tatsächlich bereinigt, bevor er dem Fenster hinzugefügt wird. Wenn Sie nur Daten in das Fenster einfügen, können keine Vorgänge ausgeführt werden. (Es sei denn, Sie haben sich in das onChangeoder etwas eingehakt ), aber sie könnten am Ende Code einfügen, der bereits eingefügt wurde, und ihn daher doppelt reparieren.

Mitch Dempsey
quelle
-1

Ich habe folgendes getan:

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;
        });
    }
};

Und dann:

tinyMCE.init({
    // ...
    plugins: "paste",
    oninit: pastePlainText // Note, without "
    // ...
})
Helge
quelle