jQuery Dialog表单序列化在后续使用中重新发布不正确的数据

时间:2010-06-02 14:01:57

标签: javascript ajax webforms jquery-dialog

我正在使用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;
    });
});

1 个答案:

答案 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变量(以及其他几个)的闭包。