CKEditor和jQuery serialize问题

问题描述

| 我在使用jQuery serialize()函数时遇到麻烦。 在上下文中,我正在打开一个表单并检查对其所做的更改,因此,在加载表单时,我会序列化数据并将其分配给全局变量:
form_data.edit_initial = $(\'#edit-job-form\').serialize();
很好 然后,当我单击按钮离开表单时,它将执行以下检查:
var start = form_data.edit_initial;
var end = $(\'#edit-job-form\').serialize();

if (start == end) 
{ 
    // Do button action 
}
else
{ 
    // Open confirm dialogue 
}
无论如何。这两个serialize()函数都起作用,但是第二个函数已经将撇号等转换为一系列数字和百分比符号(我可以放心地假设是撇号的某些代码)。 有什么想法吗?这意味着即使不进行任何更改,对话框也将打开并抱怨该表单已更改但未保存。 帮帮我! 这是一些示例数据。 我正在使用CKEditor实例。 第一部分结果:
&edit_time_digital=60&edit_desc=%3Cp%3E%0D%0A%09They\'d+like+the+share+their+site+incase+people+want+to+see+their+entire+collection+of+furnature.%3C%2Fp%3E%0D%0A%3Cp%3E%0D%0A%09The+site+needs+the+following%3A%3C%2Fp%3E%0D%0A%3Cul%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Home+page%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Standard+pages%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Galleries+(By+category)%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Contact+page%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09News+listings%3C%2Fli%3E%0D%0A%3C%2Ful%3E%0D%0A%3Cp%3E%0D%0A%09It+should+be+a+very+simple+generator+build.%3C%2Fp%3E%0D%0A&edit_status=active` 
第二个:
&edit_time_digital=60&edit_desc=%3Cp%3E%0D%0A%09They%26%2339%3Bd+like+the+share+their+site+incase+people+want+to+see+their+entire+collection+of+furnature.%3C%2Fp%3E%0D%0A%3Cp%3E%0D%0A%09The+site+needs+the+following%3A%3C%2Fp%3E%0D%0A%3Cul%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Home+page%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Standard+pages%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Galleries+(By+category)%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09Contact+page%3C%2Fli%3E%0D%0A%09%3Cli%3E%0D%0A%09%09News+listings%3C%2Fli%3E%0D%0A%3C%2Ful%3E%0D%0A%3Cp%3E%0D%0A%09It+should+be+a+very+simple+generator+build.%3C%2Fp%3E%0D%0A&edit_status=active

解决方法

如原始文章的评论中所述,我假设您正在使用CKEditor,并且在jQuery ready函数中(或在文档加载后的某个位置),您将textarea替换为编辑器实例。像大多数WYSIWYG编辑器一样,CKEditor喜欢重新格式化传递给它的文本,使其成为有效的标记,用HTML实体替换特殊字符,将内容包装在段落中,等等。这意味着尽管您没有做任何更改,但是原始内容和重新格式化的内容可以不同。 编辑器实例的初始化被延迟,并且可能在序列化表格之后发生。即使这样,CKEditor仍与创建它的(现在隐藏的)文本区域没有牢固的链接,您需要调用编辑器的updateElement函数来刷新所有更改。它通常在表单提交时自动执行,这就是为什么在提交处理程序中获取重新格式化的内容的原因。 因此,您只需要确保在第一次进行序列化之前就调用了updateElement函数,这是在加载编辑器之后的最佳位置。幸运的是,有一个事件假设了以下HTML标记:
<form id=\"myForm\">
   <textarea name=\"test\" id=\"myEditor\">My random text</textarea>
</form>
jQuery ready函数:
$(function(){
   function SerializeForm(){
      // Make sure we have the reformatted version of the initial content in the textarea
      CKEDITOR.instances.myEditor.updateElement();

      // Save the initial serialization
      form_data.edit_initial = $(\'#myForm\').serialize();
   }

   // You might as well leave it here in case CKEditor fails to load
   form_data.edit_initial = $(\'#myForm\').serialize();

   // Create editor instance    
   CKEDITOR.replace(\'myEditor\');

   // Tap into CKEditor\'s ready event to serialize the initial form state
   CKEDITOR.instances.myEditor.on(\"instanceReady\",SerializeForm);
});
,谢谢!我在CKEditor textarea上遇到了很长时间的问题。没有cakephp中的提交,我无法获得更改的值。 但现在一切正常。我必须这样叫
updateElement
才叫call6ѭ:
CKEDITOR.instances.SurveyBody.updateElement();
var formData = $(\"#surveyForm\").serialize();
,这些值是URI编码的,因为\“。serialize()\”旨在在准备要传输的HTTP参数时使用。 您只需遍历所有
<input>
元素(如果适用,还包括
<select>
<textarea>
)就可以将所有表单元素的值收集到一个大字符串中。单选按钮会有些棘手,但这仍然是一个很小的努力。,从jQuery Docs: .serialize()方法创建一个文本 标准URL编码的字符串 符号。 这就是为什么您拥有这些百分比和数字。尽管无论您调用多少次它都应返回相同的值,所以我确定您在两次调用之间正在对表单进行某些操作。 您可以使用其他方法,例如
var form_changed=false;

$(\'#edit-job-form :input\').change(function () {
    form_changed=true;
});
jQuery:输入选择器,如果您一次使用多个CK Editor实例,则可以在序列化表单之前使用更通用的方法:
    for (var i in CKEDITOR.instances) {
        CKEDITOR.instances[i].updateElement();
    };
    var data = $(\'#my-form\').serialize();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...