jQueryとTinyMCE:textarea値が送信されない


106

jQueryTinyMCEを使用してフォームを送信していますが、Textarea値が送信されないという点でシリアル化に問題があります。

これがコードです:

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

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

テキスト領域の値を投稿するために、何を変更する必要があるのか​​、またその理由を教えてください。

回答:


180

フォームを送信する前に、 tinyMCE.triggerSave();


15
TinyMCE 3.2+とjqueryプラグインを使用する:$('#textarea_id').tinymce().save();フォームのonSubmitハンドラーで。
ブレンデン、2011

@ブレンデン私はtinymceの3.5.8バージョンを使用していますが、コンソールではエラーtinymce()が関数ではないことを示しています。eldarの問題を修正しました
Code Prank

1
ベストアンサー、短くて甘いですが、最もクリーンなソリューションでもあります。複数のフィールドでも機能します。唯一の欠点は、これがすべての要素の保存をトリガーすることです。
Hugo Zink

tinymce.init({selector: 'textarea'});
スラジュ

Dan Malcolmが現在のバージョンに最適な答えを持っています-下記の投稿を参照してください-最初にリストするためには70以上の賛成票が必要です。
Robert Guice

115

TinyMCEエディターを介して変更が加えられたときに非表示のテキストエリアの値を同期させるために、TinyMCEを次のように構成できます。

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

textarea要素は自動的に最新の状態に保たれ、フォームなどをシリアル化する前に追加の手順は必要ありません。

これはTinyMCE 4.0でテストされています

デモの実行場所:http : //jsfiddle.net/9euk9/49/

更新:上記のコードは、DOOManiacのコメントに基づいて更新されました


すばらしい、今はうまくいきます。このようなことがエディターのドキュメントに記載されていない理由がわかりません。
JohnA10 2014

1
tinemce.triggerSave()save()すべてのアクティブなエディターの関数を呼び出します。:あなたが複数ある場合は、そうのようなあなたのonChange機能を設定する方が効率的であるeditor.on('change', editor.save);
DOOManiac

@DooManiac-良い電話、ありがとう。回答とjsfiddleを更新しました。saveがエディターオブジェクトのメソッドとして呼び出されるように、コールバックに無名関数を保持しました。
Dan Malcolm、

4.1.0以上のtinymceバージョンには、 'mce-active'クラスが直接追加されない太字および斜体のボタンのバグがあります(ただし、textareaフィールドにいくつかの文字が入力された後のみ)-したがって、ボタンはありません外観はアクティブに...有線...(jsfiddle.net/9euk9/304
Ouatataz

素晴らしい解決策!
Shakeel Ahmed

29

以下から のTinyMCE、jQueryとAjaxのフォーム

TinyMCEフォームの送信

  • textareaがTinyMCEに置き換えられると、実際には非表示になり、代わりにTinyMCEエディター(iframe)が表示されます。

  • ただし、フォームの送信時に送信されるのは、このテキストエリアのコンテンツです。したがって、フォームを送信する前に、その内容を更新する必要があります。

  • 標準のフォーム送信では、TinyMCEによって処理されます。Ajaxフォーム送信の場合、(フォームが送信される前に)を呼び出すことにより、手動で実行する必要があります。

    tinyMCE.triggerSave();

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

27

それはもはやテキストエリアではないからです。これはiframe(および何でもない)に置き換えられ、serialize関数はフォームフィールドからのみデータを取得します。

非表示フィールドをフォームに追加します。

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

フォームを送信する前に、エディターからデータを取得し、非表示フィールドに入力します。

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

(フォームを通常どおり投稿した場合、エディターはもちろんこれを処理しますが、フォームをスクレイピングしてデータをフォームを使用せずに自分で送信するため、フォームのonsubmitイベントはトリガーされません。)


1
私はjquery ajaxFormプラグインでこれを行っており、2番目の送信までtextarea値が渡されないため、onsubmitハンドラーで送信されたデータを変更できないと思います。
ブレンデン

1
@Brenden:プラグインがonsubmitイベントも使用してフォームをインターセプトする場合、最初にイベントハンドラーが実行されることを確認する必要があります。そうでない場合、プラグインはフォームからデータを収集してから、データをフォームフィールドにエディター。
グッファ

なぜ反対票か。何が間違っていると思うかを説明しなければ、答えを改善することはできません。
Guffa

20

フォーム上でajaxを実行する場合、最初にテキストエリアを更新するようTinyMCEに指示する必要があります。

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

8

私が使用した:

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

これがあなたがする必要があるすべてです


7

これにより、テキストエリアのフォーカスを失ったときにコンテンツが確実に保存されます

 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
tinyMCE.activeEditor.getContent()を使用するだけで作業できました。ありがとう!
MadTurki 2013

1

また、jQueryプラグインとTinyMCEのパッケージを使用するだけで、これらの種類の問題を解決できます。


1

私はしばらくの間この問題を抱えていて、機能triggerSave()せず、他の方法も何もしませんでした。

だから私はうまくいく方法を見つけました(他の人が既にtriggerSaveなどを試しているかもしれないので、ここに追加しています):

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

あなたのフォームを提出するか、何しているときにあなたがしなければならないすべては、グラブはあなたのセレクタからのデータである(私の場合は:.tinymce)を使用します$('.tinymce').text()


1

@eldar:「通常モード」で実行されている3.6.7でも同じ問題が発生しました。また、triggerSaveもsave()も機能していませんでした。

私はjQuery TinyMCEプラグインに変更しました。他に何もする必要はなく、現在は機能しています。私は、ラインのどこかに、TinyMCEのjQueryバージョン用のある種の自動トリガー保存を実装していると想定しています。


興味深い発見。バージョン3.5.7ですか?3.5.7と3.5.8でいくつかのテストをtinyMCE.triggerSave()行ったところ、通常モードで実際に問題なく動作しました。しかし、tinymce.com / wiki.php / Pluginautosaveと矛盾する、jqueryモードでの自動保存がすでに存在していることは正しいです。
sayap

0

tinymceを非表示にしてフォームを送信しますが、textareaの変更された値がありません。だから私はこれを追加しました:

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

わたしにはできる。


0

tinyMCE.triggerSave(); iFrameからの変更をテキストエリアに同期するため、これが正しい答えのようです。

しかし、他の答えに追加するには-なぜこれが必要なのですか?私はしばらくtinyMCEを使用しており、フォームフィールドが表示されないという問題は発生していませんでした。いくつかの調査の結果、フォーム要素送信の「自動パッチ」であることが判明しました。これはデフォルトでオンになっています-http://www.tinymce.com/wiki.php/Configuration3x:submit_patch

基本的に、それらは事前submitに呼び出すように再定義しますがtriggerSave、他の何かによってまだ再定義されていない場合 submit限ります。

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

そのため、コード(または別のサードパーティライブラリ)の他の要素がに干渉しているsubmit場合、それらの「自動パッチ」は機能せず、を呼び出す必要がありますtriggerSave

編集:そして実際にはOPの場合でsubmitは、まったく呼び出されていません。ajaxされているため、これは上記の「自動パッチ」をバイパスしています。


0

まず第一に:

  1. ページにtinymce jqueryプラグインを含める必要があります(jquery.tinymce.min.js)

  2. 最も簡単かつ最も安全な方法の一つは、使用しているgetContentsetContenttriggerSaveで。例:

    tinyMCE.get('editor_id').setContent(tinyMCE.get('editor_id').getContent()+_newdata);
    tinyMCE.triggerSave();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.