jQuery et TinyMCE: la valeur textarea ne se soumet pas

106

J'utilise jQuery et TinyMCE pour soumettre un formulaire, mais il y a un problème de sérialisation en ce que la valeur Textarea ne s'affiche pas.

Voici le code:

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

langue: 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]",
});

Pouvez-vous m'expliquer ce que je devrais changer, et pourquoi, afin que la valeur dans la zone de texte soit publiée?

Agus Puryanto
la source

Réponses:

180

Avant de soumettre le formulaire, appelez tinyMCE.triggerSave();

eldar
la source
15
Utilisation de TinyMCE 3.2+ avec le plugin jquery: $('#textarea_id').tinymce().save();dans le gestionnaire onSubmit de votre formulaire.
Brenden
@Brenden J'utilise la version 3.5.8 de tinymce et dans la console, l'erreur tinymce () n'est pas une fonction. J'ai résolu mon problème avec Eldar thing
Code Prank
1
Meilleure réponse, courte mais douce et est également la solution la plus propre. Fonctionne également avec plusieurs champs. Le seul inconvénient est que cela déclenche la sauvegarde de tous les éléments.
Hugo Zink
tinymce.init ({sélecteur: 'textarea'});
suraj
Dan Malcolm a la meilleure réponse pour la version actuelle - s'il vous plaît voir l'article ci-dessous - besoin de 70 votes positifs supplémentaires pour être répertorié en premier.
Robert Guice
116

Vous pouvez configurer TinyMCE comme suit pour synchroniser les valeurs des zones de texte masquées lorsque les modifications sont effectuées via les éditeurs TinyMCE:

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

Les éléments textarea seront automatiquement mis à jour et vous n'aurez besoin d'aucune étape supplémentaire avant de sérialiser les formulaires, etc.

Cela a été testé sur TinyMCE 4.0

Démo en cours d'exécution sur: http://jsfiddle.net/9euk9/49/

Mise à jour: le code ci-dessus a été mis à jour en fonction du commentaire de DOOManiac

Dan Malcolm
la source
Super, ça marche maintenant. Je ne comprends pas pourquoi quelque chose comme ça n'est pas mentionné dans la documentation de l'éditeur.
JohnA10
1
tinemce.triggerSave()appelle la save()fonction pour TOUS vos éditeurs actifs. Si vous en avez plusieurs, il est plus efficace de définir votre fonction editor.on('change', editor.save);
onChange
@DooManiac - Bon appel, merci. Réponse et jsfiddle mis à jour. J'ai conservé la fonction anonyme dans le rappel pour m'assurer que save est appelé en tant que méthode de l'objet éditeur.
Dan Malcolm
Il y a un bogue avec les versions de tinymce au-dessus de 4.1.0 avec les boutons gras et italique pour lesquels la classe 'mce-active' n'est pas ajoutée directement (mais seulement après quelques caractères tapés dans le champ textarea) - donc les boutons ne look activé ... filaire ... ( jsfiddle.net/9euk9/304 )
Ouatataz
Excellente solution!
Shakeel Ahmed
29

À partir des formulaires TinyMCE, jQuery et Ajax :

Soumission du formulaire TinyMCE

  • Lorsqu'une zone de texte est remplacée par TinyMCE, elle est en fait masquée et l'éditeur TinyMCE (un iframe) s'affiche à la place.

  • Cependant, c'est le contenu de cette zone de texte qui est envoyé lorsque le formulaire est soumis. Par conséquent, son contenu doit être mis à jour avant la soumission du formulaire.

  • Pour une soumission de formulaire standard, elle est gérée par TinyMCE. Pour une soumission de formulaire Ajax, vous devez le faire manuellement, en appelant (avant que le formulaire ne soit soumis):

    tinyMCE.triggerSave();

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

C'est parce que ce n'est plus une zone de texte. Il est remplacé par un iframe (et autres), et la fonction de sérialisation n'obtient que les données des champs de formulaire.

Ajoutez un champ masqué au formulaire:

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

Avant de publier le formulaire, récupérez les données de l'éditeur et mettez dans le champ masqué:

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

(L'éditeur s'en chargerait bien sûr lui-même si vous publiez le formulaire normalement, mais comme vous grattez le formulaire et envoyez vous-même les données sans utiliser le formulaire, l'événement onsubmit sur le formulaire n'est jamais déclenché.)

Guffa
la source
1
Je fais cela avec le plugin jquery ajaxForm et la valeur textarea n'est pas transmise avant ma deuxième soumission, donc je pense que vous ne pouvez pas changer les données soumises dans le gestionnaire onsubmit.
Brenden
1
@Brenden: Si le plugin utilise également l'événement onsubmit pour intercepter le formulaire, vous devez vous assurer que votre gestionnaire d'événements s'exécute en premier, sinon le plugin collectera les données du formulaire avant que vous n'ayez une chance de déplacer les données du éditeur dans un champ de formulaire.
Guffa
Pourquoi le vote négatif? Si vous n'expliquez pas ce que vous pensez être faux, cela ne peut pas améliorer la réponse.
Guffa
20

Lorsque vous exécutez ajax sur votre formulaire, vous devez d'abord demander à TinyMCE de mettre à jour votre zone de texte:

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

J'ai utilisé:

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

C'est tout ce que vous devez faire.

Bob Roberts
la source
7

Cela garantira que le contenu est enregistré lorsque vous perdez le focus de la zone de texte

 setup: function (editor) {
                editor.on('change', function () {
                    tinymce.triggerSave();
                });
CyberNinja
la source
6
var text = tinyMCE.activeEditor.getContent();
$('#textareaid').remove();
$('<textarea id="textareaid" name="textareaid">'+text+'</textarea>').insertAfter($('[name=someinput]'));
Swyst
la source
1
Utiliser tinyMCE.activeEditor.getContent () était la seule chose que je pouvais faire fonctionner. Merci!
MadTurki
1

Vous pouvez également simplement utiliser le plugin et le package jQuery pour TinyMCE pour résoudre ce type de problèmes.

Spocke
la source
1

J'ai eu ce problème pendant un moment et je triggerSave()n'ai pas fonctionné, ni aucune des autres méthodes.

J'ai donc trouvé un moyen qui fonctionnait pour moi (j'ajoute ceci ici car d'autres personnes ont peut-être déjà essayé triggerSave et etc ...):

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

Lorsque vous soumettez votre formulaire ou quoi que ce soit, tout ce que vous avez à faire est de récupérer les données de votre sélecteur (dans mon cas :) en .tinymceutilisant $('.tinymce').text().

James111
la source
1

@eldar: J'ai eu le même problème avec 3.6.7 fonctionnant en «mode normal»; et ni triggerSave ni save () ne fonctionnaient.

J'ai changé pour le plugin jQuery TinyMCE et sans avoir à faire autre chose, il fonctionne maintenant. Je suppose que quelque part le long de la ligne, ils ont implémenté une sorte de déclencheur automatique pour la version jQuery de TinyMCE.

SupaMonkey
la source
Une découverte intéressante. Je crois que vous voulez dire la version 3.5.7? Je viens de faire quelques tests avec 3.5.7 et 3.5.8, et tinyMCE.triggerSave()fonctionne vraiment bien pour moi en mode normal. Mais vous avez raison de dire qu'il existe déjà une sorte de sauvegarde automatique en mode jquery, ce qui contredit tinymce.com/wiki.php/Plugin:autosave : "Ce plugin sera très probablement étendu à l'avenir pour fournir le support de sauvegarde automatique AJAX."
sayap
0

Je cache juste () le formulaire tinymce et soumet, la valeur modifiée de textarea manquante. J'ai donc ajouté ceci:

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

Ça marche pour moi.

gzerone
la source
0

tinyMCE.triggerSave(); semble être la bonne réponse, car elle synchronisera les modifications de l'iFrame vers votre zone de texte.

Pour ajouter aux autres réponses, pourquoi en avez-vous besoin? J'avais utilisé tinyMCE pendant un certain temps et je n'avais pas rencontré de problèmes avec les champs de formulaire qui ne passaient pas. Après quelques recherches, il s'est avéré être leur "correction automatique" des soumissions d'éléments de formulaire, qui est activée par défaut - http://www.tinymce.com/wiki.php/Configuration3x:submit_patch

En gros, ils redéfinissent submitpour appeler à l' triggerSaveavance, mais seulement s'ils n'ont submit pas déjà été redéfinis par autre chose:

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

Donc, si quelque chose d'autre dans votre code (ou dans une autre bibliothèque tierce) submitne fonctionne pas, leur "correction automatique" ne fonctionnera pas et il deviendra nécessaire d'appeler triggerSave.

EDIT: Et en fait, dans le cas du PO, il submitn'est pas du tout appelé. Comme il est ajaxé, cela contourne le "patching automatique" décrit ci-dessus.

Andrew Tevington
la source
0

Tout d'abord:

  1. Vous devez inclure le plugin tinymce jquery dans votre page (jquery.tinymce.min.js)

  2. L'un des moyens les plus simples et les plus sûrs est d'utiliser getContentet setContentavec triggerSave. Exemple:

    tinyMCE.get('editor_id').setContent(tinyMCE.get('editor_id').getContent()+_newdata);
    tinyMCE.triggerSave();
A. Neamati
la source