View Full Version : مشکل با نمایش blockui
M.T.P
یک شنبه 28 دی 1393, 12:13 عصر
با سلام
برای چک کردن کپچا از ajax استفاده می کنم ، همچنین برای اطلاع کاربر از این پروسه blockui رو به کار می برم.
کد:
function CaptchaCheck(sObjectID){
var obj = document.getElementById(sObjectID);
$.blockUI();
var strAjaxResult=$.ajax({
type: 'post',
url: 'captcha.check.php',
dataType:'text',
data: obj.id+'='+obj.value,
async: false,
success: function(data){
$.unblockUI();
}
}).responseText;
if (strAjaxResult=='1'){
return true;
}else{
return false;
}
}
کد به درستی کار می کنه کپچا چک میشه...
مشکل اینجاست که چون ajax با async مقدار false فراخوانی میشه blockui نمایش داده نمیشه و تا زمان callback مربوط به ajax مرورگر freeze میشه
روش گذاشتن blockui در beforeSend آجاکس رو هم چک کردم باز همینه ...
به نظر شما چکار میشه کرد ؟
چون برای submit فرم حتما جواب این تابع رو می خوام بنابراین نمی تونم async رو false کنم
لطفا اگه پیشنهادی برای رفع این مشکل دارید راهنمایی بفرمایید
تشکر
id1385
یک شنبه 28 دی 1393, 16:16 عصر
دقیقاً میخواهید چیکار کنید ؟
میخواهید تا برگشت نتیجه نتونه دوباره مثلاً باتن رو فشار بده که فانکشن شما دوباره اطلاعات رو نفرسته ؟
برای همین هم صفحه رو قفل بلاک میکنید؟
اگه اینطور باشه که من میگم
خب کار خاصی نیاز نیست انجام بدید یا می تونید یه DIV با استایل و بصورت شفاف روی فرمتون قرار بدید یا هم بهترین روش استفاده از
یک VAR لاست به اینصورت که اول اونو برابر FALSE قرار بدید و اول پراسس چک کنید اگه TRUE بود RETURN بشه اگه نده TRUE کنه و ادامه بده
موقع برگشت نتیجه هم دوباره اونو FALSE کنید.
var inProcess = false;
$toolbarItems.on('click', function () {
if (inProcess)
return;
var tId = this.id;
var groupId = $(this).attr('group');
if (tId === "undefined" || tId === undefined || tId === "")
return;
$target = $(this);
var title = $(this).find('span.l-btn-text').html();
set_ribbon_loading(true);
add_tabCointer(tId, title);
addTab(tId, title, groupId);
});
function postData(eData, tab, requery, gridId, getdata, GroupId) {
inProcess = true;
//...
function postDon() {
remove_ribbon_loading();
remove_main_loading();
remove_blur();
inProcess = false;
}
همونطور که می بینید وقتی اطلاعات پست میشه و پردازش انجام میشه فانکشن postDon فراخوانی میشه که در اون هم inProcess به FALSE مقدار دهی میشه
M.T.P
یک شنبه 28 دی 1393, 16:42 عصر
ممنون که وقت گذاشتید
ببینید همین الانم تو کدی که گذاشتم مرورگر freeze میشه یعنی کاربر دیگه نمیتونه فرم رو submit کنه و منتها برای اینکه کاربر بفهمه که داره عملیاتی صورت میگیره و اصطلاحا مرورگر هنگ نکرده.
خلاصه کنم مطلب رو اینکه این خط کد فرصت اجرا پیدا نمی کنه ، مثلا:
$.blockUI({ message: '<div>Please wait...</div>' });
البته نه اینکه جواب آجاکس بلافاصله بیاد نه بعضی وقتا ممکنه جواب آجاکس تا 15 ثانیه هم نیاد و این 15 ثانیه مرورگر قفله و کاربر هم اون پیغام منو نمیبینه یعنی please wait
و میدونم چرا فرصت اجرا پیدا نمی کنه چون async آجاکس false هست...
فرض کنید تابع بالا رو برای submit فرم صدا زدم
یعنی:
<script>
function CaptchaCheck(sObjectID){
var obj = document.getElementById(sObjectID);
$.blockUI({ message: '<div>Please wait...</div>'});
var strAjaxResult=$.ajax({
type: 'post',
url: 'captcha.check.php',
dataType:'text',
data: obj.id+'='+obj.value,
async: false,
success: function(data){
$.unblockUI();
}
}).responseText;
if (strAjaxResult=='1'){
return true;
}else{
return false;
}
}
</script>
<form id='frmSendPM' method='post' onsubmit="return CaptchaCheck('pstCaptcha')" >
<input id='pstCaptcha' name='pstCaptcha' type='text' />
<input id='btnSubmit' name='btnSubmit' type='submit' value='Send' />
</form>
M.T.P
دوشنبه 29 دی 1393, 10:18 صبح
این نمونه رو گذاشتم ، خلاصه و گویا
چند خط کد اسکریپت بیشتر نیست
ببینید میشه با async=false کاری کنید که blockui پیامش بالا بیاد
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.