jQuery und TinyMCE: Der Textbereichswert wird nicht übermittelt


106

Ich verwende jQuery und TinyMCE , um ein Formular zu senden, aber es gibt ein Problem bei der Serialisierung, da der Textarea-Wert nicht veröffentlicht wird.

Hier ist der Code:

<form id="myForm" method="post" action="post.php">
    <textarea name="question_text" id="question_text" style="width:543px;height:250px;"></textarea>
</form>

Sprache: lang-js

$('#myForm').submit(function() {
    $.ajax({
        type: 'POST',
        url: $(this).attr('action'),
        data: $(this).serialize(),
        success: function(data) {
            $('#result').fadeIn('slow');
            $('#result').html(data);
            $('.loading').hide();
        }
    })
    return false;
});

tinyMCE.init({
    // General options
    mode : "textareas",
    theme : "advanced",

    // Theme options
    theme_advanced_buttons1 : "bold,italic,underline,separator,image,separator,justifyleft,justifycenter,justifyright,jformatselect,fontselect,fontsizeselect,justifyfull,bullist,numlist,undo,redo,styleprops,cite,link,unlink,media,advhr,code,preview",
    theme_advanced_buttons2 : "",
    theme_advanced_toolbar_location : "top",
    theme_advanced_toolbar_align : "left",
    theme_advanced_statusbar_location : "bottom",
    theme_advanced_resize_horizontal : false,
    theme_advanced_resizing : true,
    extended_valid_elements :"a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]",
});

Können Sie mir erklären, was ich ändern sollte und warum, um den Wert im Textbereich zu erhalten?

Antworten:


180

Rufen Sie vor dem Absenden des Formulars an tinyMCE.triggerSave();


15
Verwenden von TinyMCE 3.2+ mit dem jquery-Plugin: $('#textarea_id').tinymce().save();im onSubmit-Handler Ihres Formulars.
Brenden

@Brenden Ich verwende die Version 3.5.8 von tinymce und in der Konsole wird der Fehler tinymce () angezeigt, der keine Funktion ist. Ich habe mein Problem mit Eldar Ding behoben
Code Prank

1
Beste Antwort, kurz aber süß und auch die sauberste Lösung. Funktioniert auch mit mehreren Feldern. Einziger Nachteil ist, dass dies das Speichern für alle Elemente auslöst .
Hugo Zink

tinymce.init ({Selektor: 'textarea'});
Suraj

Dan Malcolm hat die beste Antwort für die aktuelle Version - siehe Beitrag unten - benötigt 70 weitere Upvotes, um zuerst aufgeführt zu werden.
Robert Guice

114

Sie können TinyMCE wie folgt konfigurieren, um die Werte ausgeblendeter Textbereiche synchron zu halten, wenn Änderungen über TinyMCE-Editoren vorgenommen werden:

tinymce.init({
    selector: "textarea",
    setup: function (editor) {
        editor.on('change', function () {
            editor.save();
        });
    }
});

Die Textbereichselemente werden automatisch auf dem neuesten Stand gehalten und Sie benötigen keine zusätzlichen Schritte, bevor Sie Formulare usw. serialisieren.

Dies wurde auf TinyMCE 4.0 getestet

Demo läuft unter: http://jsfiddle.net/9euk9/49/

Update: Der obige Code wurde basierend auf dem Kommentar von DOOManiac aktualisiert


Großartig, es funktioniert jetzt. Ich verstehe nicht, warum so etwas in der Dokumentation des Herausgebers nicht erwähnt wird.
JohnA10

1
tinemce.triggerSave()Ruft die save()Funktion für ALLE Ihre aktiven Editoren auf. Wenn Sie mehr als eine haben, ist es effizienter, Ihre onChange-Funktion wie editor.on('change', editor.save);
folgt

@DooManiac - Guter Anruf, danke. Antwort und jsfiddle aktualisiert. Ich habe die anonyme Funktion im Rückruf beibehalten, um sicherzustellen, dass save als Methode des Editorobjekts aufgerufen wird.
Dan Malcolm

Es gibt einen Fehler bei Tinymce-Versionen über 4.1.0 mit den fettgedruckten und kursiven Schaltflächen, für die die Klasse 'mce-active' nicht direkt hinzugefügt wird (sondern nur nach wenigen Zeichen, die in das Textfeld eingegeben wurden) - daher tun dies die Schaltflächen nicht Look aktiviert ... verkabelt ... ( jsfiddle.net/9euk9/304 )
Ouatataz

Tolle Lösung!
Shakeel Ahmed

29

Aus TinyMCE-, jQuery- und Ajax-Formularen :

Einreichung des TinyMCE-Formulars

  • Wenn ein Textbereich durch TinyMCE ersetzt wird, ist er tatsächlich ausgeblendet und stattdessen wird der TinyMCE-Editor (ein Iframe) angezeigt.

  • Es ist jedoch der Inhalt dieses Textbereichs, der gesendet wird, wenn das Formular gesendet wird. Folglich muss der Inhalt vor dem Absenden des Formulars aktualisiert werden.

  • Für eine Standardformularübermittlung wird sie von TinyMCE verwaltet. Für eine Ajax-Formularübermittlung müssen Sie dies manuell tun, indem Sie anrufen (bevor das Formular gesendet wird):

    tinyMCE.triggerSave();

$('form').bind('form-pre-serialize', function(e) {
    tinyMCE.triggerSave();
});

27

Das liegt daran, dass es kein Textbereich mehr ist. Es wird durch einen Iframe (und so weiter) ersetzt, und die Serialisierungsfunktion ruft nur Daten aus Formularfeldern ab.

Fügen Sie dem Formular ein verstecktes Feld hinzu:

<input type="hidden" id="question_html" name="question_html" />

Holen Sie sich vor dem Absenden des Formulars die Daten aus dem Editor und geben Sie sie in das ausgeblendete Feld ein:

$('#question_html').val(tinyMCE.get('question_text').getContent());

(Der Editor würde sich natürlich selbst darum kümmern, wenn Sie das Formular normal veröffentlichen. Wenn Sie jedoch das Formular abkratzen und die Daten selbst senden, ohne das Formular zu verwenden, wird das Ereignis onsubmit im Formular niemals ausgelöst.)


1
Ich mache dies mit dem jquery ajaxForm-Plugin und der Textbereichswert wird erst bei meiner zweiten Übermittlung übergeben. Ich denke, Sie können die übermittelten Daten im onsubmit-Handler nicht ändern.
Brenden

1
@Brenden: Wenn das Plugin auch das Ereignis onsubmit verwendet, um das Formular abzufangen, müssen Sie sicherstellen, dass Ihr Ereignishandler zuerst ausgeführt wird. Andernfalls sammelt das Plugin die Daten aus dem Formular, bevor Sie die Daten aus dem Formular verschieben können Editor in ein Formularfeld.
Guffa

Warum das Downvote? Wenn Sie nicht erklären, was Sie für falsch halten, kann dies die Antwort nicht verbessern.
Guffa

20

Wenn Sie Ajax in Ihrem Formular ausführen, müssen Sie TinyMCE anweisen, zuerst Ihren Textbereich zu aktualisieren:

// TinyMCE will now save the data into textarea
tinyMCE.triggerSave(); 
// now grap the data
var form_data = form.serialize(); 

8

Ich benutzte:

var save_and_add = function(){
    tinyMCE.triggerSave();
    $('.new_multi_text_block_item').submit();
};

Das ist alles was Sie tun müssen.


7

Dadurch wird sichergestellt, dass der Inhalt gespeichert wird, wenn Sie den Fokus des Textbereichs verlieren

 setup: function (editor) {
                editor.on('change', function () {
                    tinymce.triggerSave();
                });

6
var text = tinyMCE.activeEditor.getContent();
$('#textareaid').remove();
$('<textarea id="textareaid" name="textareaid">'+text+'</textarea>').insertAfter($('[name=someinput]'));

1
Die Verwendung von tinyMCE.activeEditor.getContent () war das einzige, was ich zum Arbeiten bringen konnte. Vielen Dank!
MadTurki

1

Sie können auch einfach das jQuery-Plugin und -Paket für TinyMCE verwenden, um diese Probleme zu lösen.


1

Ich hatte dieses Problem für eine Weile und triggerSave() funktionierte nicht, auch keine der anderen Methoden.

Also habe ich einen Weg gefunden, der für mich funktioniert hat (ich füge diesen hier hinzu, weil andere Leute möglicherweise bereits triggerSave und so weiter ausprobiert haben ...):

tinyMCE.init({
   selector: '.tinymce', // This is my <textarea> class
   setup : function(ed) {
                  ed.on('change', function(e) {
                     // This will print out all your content in the tinyMce box
                     console.log('the content '+ed.getContent());
                     // Your text from the tinyMce box will now be passed to your  text area ... 
                     $(".tinymce").text(ed.getContent()); 
                  });
            }
   ... Your other tinyMce settings ...
});

Wenn Sie Ihre Form sind einreichen oder was auch immer alles , was Sie tun müssen, ist die Daten greifen von Ihrem Wähler (In meinem Fall: .tinymce) verwendet $('.tinymce').text().


1

@eldar: Ich hatte das gleiche Problem mit 3.6.7 im "normalen Modus"; und weder triggerSave noch save () funktionierten.

Ich habe zum jQuery TinyMCE-Plugin gewechselt und ohne etwas anderes tun zu müssen, funktioniert es jetzt. Ich gehe davon aus, dass sie irgendwann eine Art Auto TriggerSave für die jQuery-Version von TinyMCE implementiert haben.


Interessantes Ergebnis. Ich glaube du meinst Version 3.5.7? Ich habe gerade einige Tests mit 3.5.7 und 3.5.8 durchgeführt und tinyMCE.triggerSave()funktioniert im normalen Modus für mich einwandfrei . Sie haben jedoch Recht, dass es im jquery-Modus bereits eine Art automatisches Speichern gibt, was tinymce.com/wiki.php/Plugin:autosave widerspricht : "Dieses Plugin wird höchstwahrscheinlich in Zukunft erweitert, um AJAX-Unterstützung für das automatische Speichern bereitzustellen."
Sayap

0

Ich verstecke () nur das Tinymce und sende das Formular, der geänderte Wert des Textbereichs fehlt. Also habe ich folgendes hinzugefügt:

$("textarea[id='id_answer']").change(function(){
    var editor_id = $(this).attr('id');
    var editor = tinymce.get(editor_id);
    editor.setContent($(this).val()).save();
});

Für mich geht das.


0

tinyMCE.triggerSave(); scheint die richtige Antwort zu sein, da Änderungen vom iFrame mit Ihrem Textbereich synchronisiert werden.

Um die anderen Antworten zu ergänzen - warum brauchen Sie das? Ich hatte tinyMCE für eine Weile verwendet und war nicht auf Probleme mit Formularfeldern gestoßen, die nicht durchgekommen waren. Nach einigen Recherchen stellte sich heraus, dass es sich um das "automatische Patchen" von Formularelementübermittlungen handelt, das standardmäßig aktiviert ist - http://www.tinymce.com/wiki.php/Configuration3x:submit_patch

Grundsätzlich definieren sie neu submit, um triggerSavevorher anzurufen , aber nur, wenn dies submit noch nicht durch etwas anderes neu definiert wurde:

if (!n.submit.nodeType && !n.submit.length) {
    t.formElement = n;
    n._mceOldSubmit = n.submit;
    n.submit = function() {
        // Save all instances
        tinymce.triggerSave();
        t.isNotDirty = 1;

        return t.formElement._mceOldSubmit(t.formElement);
    };
}

Wenn also etwas anderes in Ihrem Code (oder einer anderen Bibliothek eines Drittanbieters) in Konflikt gerät submit, funktioniert das "automatische Patchen" nicht und es ist notwendig, es aufzurufen triggerSave.

EDIT: Und tatsächlich wird im Fall des OP überhaupt submitnicht aufgerufen. Da es ajax'd ist, wird das oben beschriebene "automatische Patchen" umgangen.


0

Zuerst:

  1. Sie müssen das Tinymce JQuery Plugin in Ihre Seite aufnehmen (jquery.tinymce.min.js).

  2. Eine der einfachsten und sichersten Möglichkeiten ist die Verwendung getContentund Verwendung setContentvon triggerSave. Beispiel:

    tinyMCE.get('editor_id').setContent(tinyMCE.get('editor_id').getContent()+_newdata);
    tinyMCE.triggerSave();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.