2017-10-03 10 views
0

私はフォームを持っています。 TinyMCEエディタが接続されたフォームフィールドが1つあります。Django、TinyMCEフィールドのシリアル化の矛盾

フォームが変更されているかどうかを確認したい場合は、ポップアップモーダルが表示されます。 私はすべてのページのロード上で実行されます。このコードによってこれを実現:

$($('my-form').each(function() { 
    $(this).data('init') = $(this).serialize(); 
}) 
$(window).bind('beforeunload', custom_validator); 
); 

そしてもちろんcustom_validator機能は、同じファイル内にある:ページが読み込まれると、データが(「initの」

function custom_validator() { 
    $('my-form').each(function() { 
     if ($(this).data('init') != $(this).serialize()) { 
      return "Form has unsaved changes."; 
     } 
    }) 
} 

)は、TinyMCEフィールドでもシリアル化されています。 TinyMCEフィールドに複数の行が含まれている場合、serialize()はそれらを '%0D%0A'で表します。どちらが良いですか。 フォームを変更した後にページから移動したい場合や、フォームを変更した後にリロードする場合は、beforeunloadイベントによってcustom_validator関数がトリガされ、それが正常に実行されなくなります。

問題は、ページを読み込んだときにフォームに何も変更せずにページから移動したい場合に発生します。ポップアップウィンドウが表示され、フォームにも変更があります何も変わらなかった。

TinyMCEフィールドに複数の行があると、ページが読み込まれるときにdata( 'init')に '%0D%0A'文字が含まれていますが、 'custom_validator'関数でフォームのシリアル化を行うとそれらの文字は含まれません。 フォームの提出も問題なく動作します。

2つのシリアライザが異なるシリアル化文字列を返す理由は何ですか?フォームに触れていない場合は同じにする必要があります。

答えて

0

問題は、jQueryがTinyMCEエディタのコンテンツを適切にシリアル化しないことです。

これらの分離されたイベント、つまり「load」と「beforeunload」では、jQueryのserializeメソッドが別のコンテンツを返すのは、まだ私にとって謎です。しかし、基本的には、jQueryのシリアライズメソッドはフォームの入力フィールドとTinyMCEエディタのコンテンツに混乱してしまいます。

「TEXTAREA」のようなフィールドはTinyMCEエディターとは別のコンテンツを持ち、「SPAN」エレメントはインラインTinyMCEエディターのコンテンツとは異なるコンテンツを持つことができます。

custom_validatorと匿名関数を拡張して、TinyMCE以外のすべてのフィールドとTinyMCEエディタのコンテンツを別々に収集し、それらを別々にシリアライズして比較するように問題を解決しました。

このようにして、ブラウザのモーダルポップアップウィンドウの外観を迷惑にならないようにできました。