我正在使用jQuery Dialog中的表单,并且我发布的数据存在一些问题。首次加载和保存工作正常,发布正确的数据。在我刷新页面之前,每个后续加载似乎都有效,因为正确的数据在表单中,但是,在保存时,第一次加载的数据是每次发布的数据。
function formdialog(url, tack, divid, scriptload){
$.getJSON(url+tack+"/form", function(data){
var formwin = '<div><form id="formdialog">'+data['form']+'</form></div>';
var dialog = $(formwin).dialog({
title: data['title'],
autoOpen: false,
modal: true,
buttons: {
"Save": function(){
$.post(url+tack+"/process",
$("#formdialog").serialize(),
function(data){
alert($("#formdialog").serialize());
$(this).dialog('close');
$(this).remove();
}
);
},
"Cancel": function(){$(this).dialog('close'); $(this).remove();}
}
});
dialog.dialog("open");
});
}
$(function(){
$("a.edlnk").click(function(){
var url = $(this).attr("href");
formdialog(CONFIG_HREF_SITE+"ajax/"+appControl, "/"+url, divid);
return false;
});
});
答案 0 :(得分:2)
我认为问题是
$(this).dialog('close');
$(this).remove();
...在post
回调中,因为您尚未指定回调的上下文。如果是这样,将post
更改为此应修复它:
$.ajax({
url: url+tack+"/process",
type: 'POST',
data: $("#formdialog").serialize(),
context: this,
success: function(data){
alert($("#formdialog").serialize());
$(this).dialog('close');
$(this).remove();
}
});
...因为当你调用this
函数时,你会保留success
的含义。
那么为什么这个问题会引起你所看到的行为呢?因为如果您不删除formwin
div
,则不会删除formdialog
form
,这意味着您最终会有多个form
具有相同ID的页面。虽然在多个元素上具有相同的ID是无效的,因此会受到未定义的行为的影响,但当您通过ID请求元素时,大多数浏览器将为您提供第一个匹配元素 - 在你的情况下,将是早期数据的早期形式。
修改重新评论:是的,我有点错过$(this).dialog('close')
那里。 :-)有两个选项:一个是在局部变量中记住$(formwin)
然后在回调中使用它,例如:
var formwin = '<div><form id="formdialog">'+data['form']+'</form></div>';
var formwinElement = $(formwin); // <== Remember it here
var dialog = formwinElement.dialog({ // <== Use it here
// ...
$.post(url+tack+"/process",
$("#formdialog").serialize(),
function(data){
alert($("#formdialog").serialize());
$(this).dialog('close');
formWinElement.remove(); // <== And again here
}
);
...并且不要理会context
param(因此我在此更新中使用了您的原始$.post
)。这是有效的,因为post
成功处理程序是对formwinElement
变量(以及其他几个)的闭包。