javascript - CKEditor 和 jQuery serialize() 问题

标签 javascript jquery forms serialization ckeditor

我在使用 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 就绪函数中(或在您的文档加载后的某个地方)您将文本区域替换为编辑器实例。 CKEditor,像大多数 WYSIWYG 编辑器一样,喜欢重新格式化您传递给它的文本,使其成为有效标记,用 HTML 实体替换特殊字符,将您的内容包装在一个段落中,等等。这意味着虽然您没有更改任何内容,但原始并且重新格式化的内容可以不同。

编辑器实例的初始化被延迟,并且可能发生在您序列化表单之后。即便如此,CKEditor 与创建它的(现在隐藏的)textarea 没有强链接,您需要调用编辑器的 updateElement 函数来刷新所有更改。它通常在表单提交时自动执行,这就是您在提交处理程序中获取重新格式化内容的原因。

因此,您只需确保在第一次序列化之前调用 updateElement 函数,最好的位置是在编辑器加载之后。幸运的是有一个事件,假设有以下 HTML 标记:

<form id="myForm">
   <textarea name="test" id="myEditor">My random text</textarea>
</form>

jQuery 就绪函数:

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

关于javascript - CKEditor 和 jQuery serialize() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5716644/

相关文章:

html - Angular2- 对象作为 radio 输入值

Javascript 输出错误

Javascript ClearTimeout 不起作用

javascript - 完全删除/删除一个div并显示另一个(切换)

javascript - Jquery .children() 未按预期工作

javascript - 在其他指令中重用 Angular Directive(指令)

javascript - 仅当选中特定数量的复选框时才自动提交表单

javascript - 单击页面上其他位置时关闭灯箱

javascript - mediaelement.js - 暂停/播放 onclick 视频?

javascript - 使用 Form 不使用 AJAX 从 Bootstrap 表中提取 JS 变量。更好的方法?