问题描述
|
我在使用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();