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(); }
});
如您所见,对话框已初始化,但在单击#对话框按钮
之前不会自动打开,此时内容通过jQueryload()
拉入对话框,并在html加载完成后通过回调打开
在对话框中,单击事件绑定到使用one()
的.save
按钮,理论上不允许触发超过一个单击事件。我还采取了另外一个步骤,单击按钮后将其disabled属性设置为“true”,并在对话框关闭时对其调用jQueryunbind()
下面是加载到对话框中并将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中获取动态加载的值。无论如何,我认为这个问题目前的形式是无法回答的