Javascript 在ajax进程运行时在引导框中显示加载消息?
我的应用程序中有一个显示状态的页面。状态显示在下拉菜单中,有两个选项Javascript 在ajax进程运行时在引导框中显示加载消息?,javascript,jquery,ajax,bootstrap-4,bootbox,Javascript,Jquery,Ajax,Bootstrap 4,Bootbox,我的应用程序中有一个显示状态的页面。状态显示在下拉菜单中,有两个选项Active/Inactive。用户只需单击菜单并选择选项即可更改状态。对于这个过程,我使用JQuery/Ajaxonchangetrigger来跟踪状态变化。代码工作正常,并将值保存在datatbase中。我遇到的问题与bootbox和显示加载消息有关。当用户单击菜单并更改状态时,ajax将发送请求。此时,对话框窗口将与加载消息一起显示在用户屏幕上。ajax请求完成后,加载对话框应隐藏并向用户显示状态已成功保存的消息。下面是代
Active/Inactive
。用户只需单击菜单并选择选项即可更改状态。对于这个过程,我使用JQuery/Ajaxonchange
trigger来跟踪状态变化。代码工作正常,并将值保存在datatbase中。我遇到的问题与bootbox
和显示加载消息有关。当用户单击菜单并更改状态时,ajax将发送请求。此时,对话框窗口将与加载消息一起显示在用户屏幕上。ajax请求完成后,加载对话框应隐藏并向用户显示状态已成功保存的消息。下面是代码示例:
功能警报框(标题、消息、大小){
标题=标题| |“警报”;
消息=消息| |“警报框”;
尺寸=尺寸| |“lg”;
bootbox.alert({
尺寸:尺寸,
标题:标题,,
信息:信息
});
};
$('.status')。在('change',function()上{
设$curr_fld=$(此),
状态标识=$curr\u fld.attr('data-id'),
dialog=bootbox.dialog({
消息:“正在加载…
”,
关闭按钮:false
});
$curr_fld.prop(“禁用”,真实);
/***开始:这是一个测试代码***/
/*
setTimeout(函数(){
dialog.modal('hide');
$curr_fld.prop(“禁用”,错误);
alertBox(“警报消息”,状态\u id);
}, 3000);
*/
/***结束:这是一个测试代码***/
$.ajax({
键入:“POST”,
url:'test.php?id=1',
数据:{
“状态id”:状态id
},
数据类型:“json”
}).完成(功能(obj){
dialog.modal('hide');
$curr_fld.prop(“禁用”,错误);
如果(对象状态===200){
警报框(“警报消息”,obj);
}否则{
警报框(“警报消息”,obj);
}
}).fail(函数(jqXHR、textStatus、errorshown){
$curr_fld.prop(“禁用”,错误);
alertBox(“错误”,文本状态);
});
});代码>
部分
地位
南方
活跃的
不活跃的
北
活跃的
不活跃的
东边
活跃的
不活跃的
西部
活跃的
不活跃的
部分
地位
我注意到了几个问题:
您需要从ajax调用的always
函数关闭对话框。测试时会出现失败,但您没有关闭对话框的代码。然而,这仍然没有解决问题
这似乎是boostrap模式的一个问题。发生的情况是,在动画完成之前调用hide
函数太快。有两种解决方案可以解决此问题:
使用animate:false
禁用动画
添加检测动画是否完成的代码,如果动画未完成,请在始终
功能中进行适当操作
$('.status')。在('change',function()上{
设$curr_fld=$(此),
所示加载=错误,
状态标识=$curr\u fld.attr('data-id'),
dialog=bootbox.dialog({
//设置动画:false,//加载所示内容=true);
$curr_fld.prop(“禁用”,真实);
$.ajax({
键入:“POST”,
url:'test.php?id=1',
数据:{
“状态id”:状态id
},
数据类型:“json”
}).完成(功能(obj){
$curr_fld.prop(“禁用”,错误);
如果(对象状态===200){
警报框(“警报消息”,obj);
}否则{
警报框(“警报消息”,obj);
}
}).fail(函数(jqXHR、textStatus、errorshown){
$curr_fld.prop(“禁用”,错误);
alertBox(“错误”,文本状态);
}).总是(()=>{
//立即隐藏,或通过侦听等待动画完成
//以显示模式。
如图所示,正在加载
?dialog.modal('隐藏')
:dialog.on('show.bs.modal',()=>dialog.modal('hide');
});
});
可能有更简洁的方法来处理动画问题而不禁用动画本身。这只是一种方法。我注意到了几个问题:
您需要从ajax调用的始终
函数关闭对话框。测试时会出现失败,但您没有关闭对话框的代码。但是,这仍然无法解决问题
这似乎是boostrap模式的一个问题。发生的情况是在动画完成之前过早调用了隐藏
函数。有两种解决方案可以解决此问题:
使用animate:false
禁用动画
添加检测动画是否完成的代码,如果动画未完成,请在始终
功能中进行适当操作
$('.status')。在('change',function()上{
设$curr_fld=$(此),
所示加载=错误,
状态标识=$curr\u fld.attr('data-id'),
dialog=bootbox.dialog({
//设置动画:false,//加载所示内容=true);
$curr_fld.prop(“禁用”,真实);
$.ajax({
键入:“POST”,
url:'test.php?id=1',
数据:{
“状态id”:状态id
},
数据类型:“json”
}).完成(功能(obj){
$curr_fld.prop(“禁用”,错误);
如果(对象状态===200){
警报框(“警报消息”,obj);
}否则{
警报框(“警报消息”,obj);
}
}).fail(函数(jqXHR、textStatus、errorshown){
$curr_fld.prop(“禁用”,错误);
alertBox(“错误”,文本状态);
}).总是(()=>{
//立即隐藏,或通过侦听等待动画完成
//以显示模式。
如图所示,正在加载
?dialog.modal('隐藏')
:dialog.on('show.bs.modal',()=>dialog.modal('hide');
});
});
可能有莫言
$('.status').on('change', function() {
let $curr_fld = $(this),
loading_shown = false,
status_id = $curr_fld.attr('data-id'),
dialog = bootbox.dialog({
// animate: false, // <-- simple way that makes the issue go away.
message: '<p class="text-center mb-0"><i class="fa fa-spin fa-cog"></i> Loading...</p>',
closeButton: false,
}).on('shown.bs.modal', () => loading_shown = true);
$curr_fld.prop("disabled", true);
$.ajax({
type: 'POST',
url: 'test.php?id=1',
data: {
'status_id': status_id
},
dataType: 'json'
}).done(function(obj) {
$curr_fld.prop("disabled", false);
if (obj.status === 200) {
alertBox('Alert Message', obj);
} else {
alertBox('Alert Message', obj);
}
}).fail(function(jqXHR, textStatus, errorThrown) {
$curr_fld.prop("disabled", false);
alertBox('Error', textStatus);
}).always(() => {
// hide immediately, or wait until the animation is complete by listening
// to shown.bs.modal.
loading_shown
? dialog.modal('hide')
: dialog.on('shown.bs.modal', () => dialog.modal('hide'));
});
});
setTimeout(function(){
dialog.modal('hide')
},200);