0

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

1 回答 1

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 的 s。尽管在多个元素上使用相同的 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参数(因此我$.post在此更新中使用您的原件)。这是有效的,因为成功处理程序是对变量(和其他一些东西)post的闭包。formwinElement

于 2010-06-02T14:11:58.403 回答