jQuery e TinyMCE: o valor textarea não envia


106

Estou usando jQuery e TinyMCE para enviar um formulário, mas há um problema de serialização porque o valor Textarea não é postado.

Aqui está o código:

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

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

Você pode me explicar o que devo alterar e por quê, para que o valor na área de texto seja postado?

Respostas:


180

Antes de enviar o formulário, ligue tinyMCE.triggerSave();


15
Usando o TinyMCE 3.2+ com o plugin jquery: $('#textarea_id').tinymce().save();no manipulador onSubmit do seu formulário.
— Brenden,

@Brenden Estou usando a versão 3.5.8 do tinymce e no console mostra o erro. Tinymce () não é uma função. Resolvi meu problema com o velho
— Code Prank

1
Melhor resposta, curta mas doce e também a solução mais limpa. Funciona com vários campos também. A única desvantagem é que isso ativa a economia de todos os elementos.
— Hugo Zink

tinymce.init ({seletor: 'textarea'});
— suraj

Dan Malcolm tem a melhor resposta para a versão atual - por favor, veja a postagem abaixo - são necessários mais 70 votos positivos para serem listados primeiro.
— Robert Guice

115

Você pode configurar o TinyMCE da seguinte maneira para manter os valores das áreas de texto ocultas em sincronia conforme as alterações são feitas por meio dos editores TinyMCE:

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

Os elementos textarea serão mantidos atualizados automaticamente e você não precisará de nenhuma etapa extra antes de serializar os formulários, etc.

Isso foi testado no TinyMCE 4.0

Demonstração em execução em: http://jsfiddle.net/9euk9/49/

Atualização: O código acima foi atualizado com base no comentário do DOOManiac


Ótimo, agora funciona. Não entendo por que algo assim não é mencionado na documentação do editor.
— JohnA10

1
tinemce.triggerSave()chama a save()função para TODOS os seus editores ativos. Se você tiver mais de um, é mais eficiente definir sua função onChange da seguinte forma:editor.on('change', editor.save);
— DOOManiac

@DooManiac - Boa chamada, obrigado. Resposta e jsfiddle atualizados. Eu mantive a função anônima no retorno de chamada para garantir que save seja chamado como um método do objeto editor.
— Dan Malcolm de

Há um bug com as versões do tinymce acima de 4.1.0 com os botões negrito e itálico para os quais a classe 'mce-active' não é adicionada diretamente (mas apenas após alguns caracteres digitados no campo textarea) - portanto, os botões não parece ativado ... com fio ... ( jsfiddle.net/9euk9/304 )
— Ouatataz

Ótima solução!
— Shakeel Ahmed

29

Dos formulários TinyMCE, jQuery e Ajax :

Envio de formulário TinyMCE

  • Quando uma área de texto é substituída por TinyMCE, ela fica realmente oculta e o editor TinyMCE (um iframe) é exibido.

  • No entanto, é o conteúdo desta área de texto que é enviado quando o formulário é enviado. Consequentemente, seu conteúdo deve ser atualizado antes do envio do formulário.

  • Para o envio de um formulário padrão, ele é gerenciado pelo TinyMCE. Para o envio de um formulário Ajax, você deve fazer isso manualmente, chamando (antes de o formulário ser enviado):

    tinyMCE.triggerSave();

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

27

Isso porque não é mais uma área de texto. Ele foi substituído por um iframe (e outros enfeites), e a função de serializar apenas obtém dados dos campos do formulário.

Adicione um campo oculto ao formulário:

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

Antes de postar o formulário, pegue os dados do editor e coloque no campo oculto:

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

(O editor, é claro, cuidaria disso sozinho se você postasse o formulário normalmente, mas como você está copiando o formulário e enviando os dados sem usar o formulário, o evento onsubmit no formulário nunca é acionado.)


1
Estou fazendo isso com o plugin jquery ajaxForm e o valor textarea não é passado até meu segundo envio, então estou pensando que você não pode alterar os dados enviados no manipulador onsubmit.
— Brenden,

1
@Brenden: Se o plug-in também usa o evento onsubmit para interceptar o formulário, você deve ter certeza de que seu manipulador de eventos é executado primeiro, caso contrário, o plug-in coletará os dados do formulário antes que você tenha a chance de mover os dados do editor em um campo de formulário.
— Guffa

Por que o downvote? Se você não explicar o que acha que está errado, isso não pode melhorar a resposta.
— Guffa

20

Quando você executa o ajax em seu formulário, você precisa dizer ao TinyMCE para atualizar sua área de texto primeiro:

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

8

Eu usei:

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

Isso é tudo que você precisa fazer.


7

Isso irá garantir que o conteúdo seja salvo quando você perder o foco da área de texto

 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
Usar tinyMCE.activeEditor.getContent () foi a única coisa que consegui fazer funcionar. Obrigado!
— MadTurki de

1

Você também pode simplesmente usar o plugin jQuery e o pacote para TinyMCE, ele resolve esses tipos de problemas.


1

Eu tive esse problema por um tempo e triggerSave()não funcionou, nem qualquer um dos outros métodos.

Então, encontrei uma maneira que funcionou para mim (estou adicionando aqui porque outras pessoas podem já ter tentado o triggerSave e 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 ...
});

Quando você está enviando seu formulário ou o que quer que seja, tudo que você precisa fazer é pegar os dados do seu seletor (no meu caso .tinymce:) usando $('.tinymce').text().


1

@eldar: Eu tive o mesmo problema com o 3.6.7 rodando no 'modo normal'; e nem triggerSave ou save () estavam funcionando.

Mudei para o plugin jQuery TinyMCE e sem fazer mais nada ele está funcionando agora. Estou assumindo que em algum lugar ao longo da linha eles implementaram algum tipo de triggerSave automático para a versão jQuery do TinyMCE.


Achado interessante. Eu acredito que você quer dizer a versão 3.5.7? Acabei de fazer alguns testes com 3.5.7 e 3.5.8 e, tinyMCE.triggerSave()na verdade, funciona bem para mim no modo normal. Mas você está correto ao dizer que já existe algum tipo de salvamento automático no modo jquery, o que contradiz tinymce.com/wiki.php/Plugin:autosave : "Este plug-in provavelmente será estendido no futuro para fornecer suporte ao salvamento automático AJAX."
— sayap

0

Acabei de ocultar () o tinymce e enviar o formulário, faltando o valor alterado de textarea. Então eu adicionei isto:

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

Funciona para mim.


0

tinyMCE.triggerSave(); parece ser a resposta correta, pois sincronizará as alterações do iframe com a área de texto.

Para adicionar às outras respostas - por que você precisa disso? Eu estava usando o tinyMCE por um tempo e não tinha encontrado problemas com campos de formulário que não chegavam. Depois de alguma pesquisa, descobriu-se que era o "patching automático" dos envios de elementos do formulário, que está ativado por padrão - http://www.tinymce.com/wiki.php/Configuration3x:submit_patch

Basicamente, eles redefinem submitpara chamar de triggerSaveantemão, mas apenas se submit ainda não tiver sido redefinido por outra coisa:

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

Então, se algo mais em seu código (ou outra biblioteca de terceiros) está bagunçando submit, seu "patching automático" não funcionará e será necessário chamartriggerSave .

EDIT: E, na verdade, no caso do OP, submitnão está sendo chamado. Como é ajax, isso está contornando o "patch automático" descrito acima.


0

Em primeiro lugar:

  1. Você deve incluir o plugin tinymce jquery em sua página (jquery.tinymce.min.js)

  2. Uma das formas mais simples e seguras é usar getContente setContentcom triggerSave. Exemplo:

    tinyMCE.get('editor_id').setContent(tinyMCE.get('editor_id').getContent()+_newdata);
    tinyMCE.triggerSave();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.