Javascript jQuery对话框表单序列化在后续使用中重新发布错误数据

Javascript jQuery对话框表单序列化在后续使用中重新发布错误数据,javascript,ajax,webforms,jquery-dialog,Javascript,Ajax,Webforms,Jquery Dialog,我在jQuery对话框中处理表单,它发布的数据有一些问题。首先加载并保存工作良好,发布正确的数据。在我刷新页面之前,每个后续加载似乎都能正常工作,因为表单中有正确的数据,但是,保存时,第一次加载的数据就是每次发布的数据 function formdialog(url, tack, divid, scriptload){ $.getJSON(url+tack+"/form", function(data){ var formwin = '<div><for

我在jQuery对话框中处理表单,它发布的数据有一些问题。首先加载并保存工作良好,发布正确的数据。在我刷新页面之前,每个后续加载似乎都能正常工作,因为表单中有正确的数据,但是,保存时,第一次加载的数据就是每次发布的数据

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;
    });
});
函数formdialog(url、tack、divid、scriptload){
$.getJSON(url+tack+“/form”,函数(数据){
var formwin=''+数据['form']+'';
变量对话框=$(formwin).dialog({
标题:数据['title'],
自动打开:错误,
莫代尔:是的,
按钮:{
“保存”:函数(){
$.post(url+tack+“/进程”,
$(“#formdialog”).serialize(),
功能(数据){
警报($(“#formdialog”).serialize());
$(this.dialog('close');
$(this.remove();
}
);
},
“取消”:函数(){$(this).dialog('close');$(this.remove();}
}
});
dialog.dialog(“打开”);
});
}
$(函数(){
$(“a.edlnk”)。单击(函数(){
var url=$(this.attr(“href”);
formdialog(CONFIG_HREF_SITE+“ajax/”+appControl,“/”+url,divid);
返回false;
});
});

我认为问题在于

$(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();
    }
});
…因为当调用
success
函数时,您保留了
this
的含义

那么为什么这个问题会导致你看到的行为呢?因为如果不删除
formwin
div
,就不会删除
formdialog
表单
,这意味着页面上有多个具有相同ID的
表单。尽管在多个元素上具有相同ID是无效的,因此会发生未定义的行为,大多数浏览器都会在您按ID请求元素时给您第一个匹配的元素,在您的情况下,这将是包含早期数据的早期表单


编辑回复您的评论:是的,我有点错过了那里的
$(这个)。对话框('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
                    }
                );
var formwin=''+数据['form']+'';

var formwinElement=$(formwin);//数据发布现在效果很好。问题是对话框现在无法关闭。建议?