Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQueryUI对话框中的按钮发送两次ajax请求_Jquery_Ajax_Jquery Ui_Jquery Ui Dialog - Fatal编程技术网

jQueryUI对话框中的按钮发送两次ajax请求

jQueryUI对话框中的按钮发送两次ajax请求,jquery,ajax,jquery-ui,jquery-ui-dialog,Jquery,Ajax,Jquery Ui,Jquery Ui Dialog,这是一个反复出现的问题,所以我知道(我认为)最常见的陷阱 情景: 对话框会在单击按钮时加载动态内容 事件绑定到发送ajax请求的对话框按钮之一 ajax请求会被发送两次 以下是呈现对话框的相关代码: $('#dialog-button'). on('click', function() { $('#dialog').load('dialog.php', function() { $('#dialog').dialog('open'); }); }); $('#dialog').d

这是一个反复出现的问题,所以我知道(我认为)最常见的陷阱

情景:

  • 对话框会在单击按钮时加载动态内容
  • 事件绑定到发送ajax请求的对话框按钮之一
  • ajax请求会被发送两次
以下是呈现对话框的相关代码:

$('#dialog-button'). on('click', function() {
    $('#dialog').load('dialog.php', function() { $('#dialog').dialog('open'); }); 
});

$('#dialog').dialog({
    autoOpen: false,
    modal: true,
    closeOnEscape: false,
    buttons: [{
        "text": "Save",
        "class": "save",
        "value": "2",
    },{
        "text": "Cancel",
        "icons": { primary: "ui-icon-cancel" },
        "click": function() {
            $( this ).dialog( "close" );
        }
    }],
    close : function() { $('.ui-dialog-buttonset .save').unbind(); }
});
如您所见,对话框已初始化,但在单击
#对话框按钮
之前不会自动打开,此时内容通过jQuery
load()
拉入对话框,并在html加载完成后通过回调打开

在对话框中,单击事件绑定到使用
one()
.save
按钮,理论上不允许触发超过一个单击事件。我还采取了另外一个步骤,单击按钮后将其disabled属性设置为“true”,并在对话框关闭时对其调用jQuery
unbind()

下面是加载到对话框中并将ajax调用绑定到按钮的代码:

$('.ui-dialog-buttonset .save').one('click', function() {
    $('.ui-dialog-buttonset button').prop('disabled',true);

    $.ajax({
        url: 'save.php',
        dataType: 'json',
        success: function(error) {
            $('.ui-dialog-buttonset button').prop('disabled',false);
            if (error) {
                alert(error);
            } else {
                window.location = 'index.php';
            }
        },
        error: function(xhr, ajaxOptions, thrownError) {
            alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
        }
    });
});
当ajax完成时,窗口要么重新加载,要么发生错误。没有错误


到目前为止,我唯一有效的理论是,不知何故,整个对话被创建了两次,但到目前为止,我一直无法做到这一点。除此之外,我完全不知所措。我自己无法重现这个问题,在每天使用的web应用程序中,它似乎大约每月只发生一次。这显然使调试变得更加困难。

只是提供的代码中没有任何明显的错误(尽管我认为通过ajax交付的html附加新的事件处理程序是一种不好的做法)。你能包含相关的HTML并可能制作一个MCVE吗?@blgt-我理解你为什么会问这个问题,但这并不现实,因为它是一个相当复杂(和专有)的应用程序。我等待对话框html加载的原因是,ajax数据是在单击时从对话框内容生成的。您建议如何执行此操作?事件委派通常是一种方式,而不是不断绑定/解除绑定事件处理程序。执行类似于
$.ajax({url:$(“#dialog”).find(“.url holder”).data(“url value”)/*…*/})的操作以从html中获取动态加载的值。无论如何,我认为这个问题目前的形式是无法回答的