使用两次时Jquery阻止UI无法正常工作?

时间:2012-05-22 15:31:36

标签: jquery-ui jquery jquery-plugins jquery-blockui

我正在使用jquery block UI插件,我的要求是检查用户是否是授权用户,这是我的代码

<script language="javascript" type="text/javascript">

        $(document).ready(function () {
            $('#btnsubmit').click(function () {
                $.blockUI({ css: {
                    border: 'none',
                    padding: '15px',
                    backgroundColor: '#000',
                    '-webkit-border-radius': '10px',
                    '-moz-border-radius': '10px',
                    opacity: .5,
                    color: '#fff'
                }
                });
            });
        }); 

     function ajaxAuth() {
       //UserLogin.IServiceLogin.HelloWorldCC(OnSuccess, OnFailure);
         var usrname = document.getElementById('txtusrname').value;
         var pasd = document.getElementById('txtpassword').value;
         UserLogin.IServiceLogin.GetUseCred(usrname, pasd, onSuccess, onFailed);
     }

     function onSuccess(result) {
         setTimeout($.unblockUI, 0);
         var obj = jQuery.parseJSON(result);

         if (obj.name != "error" ) {
             document.getElementById('labusr').value = obj.name;
             document.getElementById('labpass').value = obj.passd;
             document.getElementById('labkey').value = obj.key;
             location.href = "DesignAPage.aspx";
         } else {
             $.blockUI({ message: $('#question'), css: { width: '350px'} });

//             $('#ok').click(function () {
//                 $.unblockUI();
//                 return false;
//             }); 
         }
     }

     function onFailed(result) {
         alert("failure");
     }

    </script>

所以问题是当我使用$.blockUI({ message: $('#question'), css: { width: '350px'} });时,它只会阻止屏幕一秒钟并取消阻止屏幕。

非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

问题是由setTimeout($.unblockUI, 0);造成的。即使你可能认为调用它会导致代码附加函数立即运行,但事实并非如此。您可以通过运行以下命令来验证这一点:

setTimeout(function() {
    console.log('one');
}, 0);
console.log('two');
two之前记录

one。这样做的原因在于JavaScript内部处理计时器的方式。因为它是单线程的,所以没有任何东西同时运行。将0毫秒传递给setTimeout只会强制该函数在第一个可用时刻运行。在这种情况下,就在调用$.blockUI之后。

John Resig在http://ejohn.org/blog/how-javascript-timers-work/撰写了一篇很好的文章。

答案 1 :(得分:1)

尝试在else块中执行此操作

else {
             $.unblockUI({
                 onUnblock: function () {
                     $.blockUI({ message: $('#question'), css: {
                         border: 'none',
                         padding: '15px',
                         backgroundColor: '#000',
                         '-webkit-border-radius': '10px',
                         '-moz-border-radius': '10px',
                         opacity: .5,
                         color: '#fff'
                     }
                     });
                     $('#ok').click(function () {
                         $.unblockUI();
                         return false;
                     }); 
                   }
             }); 
         }

答案 2 :(得分:0)

我把你的代码剁了一下但这很有用。

$(document).ready(function() {
$.blockUI({ css: { 
    border: 'none', 
    padding: '15px', 
    backgroundColor: '#000', 
    '-webkit-border-radius': '10px', 
    '-moz-border-radius': '10px', 
    opacity: .5, 
    color: '#fff' 
    } 
    }); 

    onSuccess();

});

function onSuccess() { 
$.unblockUI();

$.blockUI({ message: "Some message", css: { width: '350px'} }); 

}