Jquery plugin blockUI not working with ajax
我想在进行特定的ajax调用时阻止当前页面,并使用blockUI作为消息框。我不能只使用
我的代码如下..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | bc.find('.submit').click(function (e) { e.preventDefault(); if ($(this).hasClass('lock')) return; $.blockUI(); $(this).addClass('lock'); bc.submit(); }); var validator; validator = bc.validate({ ignore: '', rules: { UserName: { required: true } }, messages: { UserName: 'must have', }, submitHandler: function (form) { $.ajax({ url: '/yyyy/xxxx', type: 'POST', data: postdata, complete: function () { bc.find('.submit').removeClass('lock'); }, success: function (data) { if (data.status == 'OK') { $.blockUI({ message: 'OK' }); ...... } else { switch (data.status) { case 'xxx': ...... } $.unblockUI(); } }, error: function () { $.unblockUI(); alert('xxx'); } }); } }); |
方案是,当我单击
在2016年编辑,有一个改变问题意义的编辑(可能是由于我当时非常糟糕的英语),我已经将更改回到这里,并使其更清楚,请不要再在下面更改。
但实际上,只有在ajax调用完成后(调试步骤超过
(上面是我的意思是答案中的chrome或firefox调试工具的异常执行顺序。因为
这不是我想要的,我无法弄清楚这一点。
在beforeSend函数中设置Block UI,在complete函数中设置unBlockUI,以便获得您期望的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | $.ajax({ url: '/yyyy/xxxx', type: 'POST', data: postdata, beforeSend : function() { $.blockUI({ message: 'OK' }); }, complete: function () { bc.find('.submit').removeClass('lock'); $.unblockUI(); }, success: function (data) { if (data.status == 'OK') { ...... } else { switch (data.status) { case 'xxx': ...... } } }, error: function () { $.unblockUI(); alert('xxx'); } }); |
这将确保您的Ui会在请求发出后立即阻止,并在完成后立即取消阻止。
我有同样的问题因为我使用了同步ajax调用,即aync是false
我通过将ajax调用异步调用为true来解决它
1 | $.ajaxSetup({ async :true}); |
使用ajax(如ajaxBlockUI)的包装器可以使代码更简单 - 请参阅https://stackoverflow.com/a/28358070/460084
所有你需要做的就是添加blockUI:true到ajaxBlockUI,实际阻止和解除阻止UI将在内部处理。
问题是由chrome和firefox中的浏览器调试工具引起的执行序列异常。使用调试器,我确认是否在ajax调用之前执行了
2016-01-25更新:
注意:
并且,我多年没有使用