PDA

View Full Version : سوال: مشکل درajax بدون ajax



minaalamshahi
یک شنبه 02 مرداد 1390, 10:51 صبح
با سلام
من از تکنولوژی ajax بدون ajax استفاده کردم حالا احتیاج دارم که state صفحه رو چک کنم اگر ارسال اطلاعات نشده یک gif رو نمایش بدم و صفحه رو به حالت تاریک نشون بدم
و بعد از ارتمام کار پیغام بدم که ارسال اطلاعات با موفقیت انجام شد
ممنون میشم راهنمایی کنید

Himalaya
یک شنبه 02 مرداد 1390, 11:06 صبح
سلام
تو این روش شما 2 تا تابع جاوا اسکریپت داری. یکی قبل از اجرای دستورات سمت سرور اجرا میشه و یکی هم بعد از اجرای دستورات سمت سرور فراخوانی میشه.
قبل از اینکه توسط جاوا اسکریپت، کدهای سمت سرور رو اجرا کنی (تابع جاوا اسکریپت اول)، کارایی رو که میخوای سمت کلاینت انجام بده (مثلا همون نماش تصویر gif و ...) و بعد از دریافت پاسخ از سرور تو تابع جاوا اسکریپتی که دریافت پاسخ از سرور رو handle میکنه، اون تصویر gif رو بردار و پیغام مناسب رو همراه یه تصویر مثلا Close نمایش بده (با کلیک رو این تصویر، صفحه به حالت اول برمیگرده)

minaalamshahi
یک شنبه 02 مرداد 1390, 11:42 صبح
ممنون اما تابعی وجود نداره که بتونم state صفحه رو چک کنم این روش رو خودم میدونم

Himalaya
یک شنبه 02 مرداد 1390, 12:27 عصر
ببینید 2 تا حالت وجود داره.
1. شما با زدن یه دکمه اطلاعات رو ارسال میکنید و اینجا میخواید اون تصویر gif نشون داده بشه (همراه با کشیده شدن یه لایه روی صفحه) و بعد از ارسال موفقیت آمیز میخواید یه پیغام به کاربری که اطلاعات رو ارسال کرده نمایش بدید (فرض من این بود که شما این حالت رو میخواید که خوب جوابش هم میشه همون چیزی که تو پست 2 گفتم و شما هم گفتد این رو میدونید (همه این کارا سمت 1 کاربر انجام میشه)

2. حالت چت رو میخواید پیاده سازی کنید. که دیگه قضیه فرق میکنه. (1 کاربر اطلاعات ارسال میکنه و کاربر دیگه باید به نحوی از ارسال این اطلاعات مطلع بشه. که اینجا باید از تایمر جاوا اسکریپت استفاده کنید
setTimeout)

در وب اصولا تا کلاینت چیزی رو درخواست نکنه، سرور هیچگونه واکنشی نمیتونه انجام بده.
برنامه های چت نیز از همین قانون پیروی می کنند.

شما اول بگید که اصلا میخواید چیکار کنید.

حالا احتیاج دارم که state صفحه رو چک کنممنظورتون از State صفحه چیه؟


اگر ارسال اطلاعات نشده
و بعد از اتمام کار پیغام بدم که ارسال اطلاعات با موفقیت انجام شداین اطلاعات رو فرض کنیم کاربر 1 قراره بفرسته. اینکه اطلاعات فرستاده شده یا نه رو خود همین کاربر باید مطلع بشه (که میشه همون مورد 1) یا کاربر 2 (که میشه مورد 2)

minaalamshahi
یک شنبه 02 مرداد 1390, 12:50 عصر
منظور من استفاده از readyState == 4readyState == 4
هست که نمیدونم چطوری باید ازش در اینجا استفاده کنم.

minaalamshahi
یک شنبه 02 مرداد 1390, 13:10 عصر
function checkstate()
{
var xmlHttp =new XMLHttpRequest();


if(xmlHttp.readyState != 4 || xmlHttp.readyState != 'complete')
{
}
}
من به همچین کدی احتیاج دارم اما نمیدونم کی و کجا و چطور باید استفاده کنم
اما می خوام اگر اطلاعات من به database ارسال نشده عکس gif رو نشون بدم

Himalaya
یک شنبه 02 مرداد 1390, 13:48 عصر
مقدار readyStete و Status زمانی که جواب از سمت سرور برای کلاینت برگشت داده میشه، چک میشه تا معلوم بشه که عملیات با موفقیت، سمت سرور انجام شده یا نه.
شما تو برنامتون واسه کار مورد نظرتون

و بعد از اتمام کار پیغام بدم که ارسال اطلاعات با موفقیت انجام شد باید از اون استفاده کنید
فرض کنید که قبل از اجرای کدای سمت سرور، تابع js که موقع بازگشت جواب از سرور، باید اجرا بشه رو به این صورت معرفی کردید

xmlHttp.onreadystatechange = handleStateChange;
و این تابع رو هم به این صورت نوشتید

function handleStateChange() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
parseResults();
}
}
}

تابع parseResults زمانی اجرا میشه که عملیات سمت سرور با موفقیت انجام شده باشه. من else مربوط به if ها رو ننوشتم. مطمئنا اگه وارد قسمت else بشیم یعنی عملیات با شکست همراه بوده و میشه تو هر دو حالت پیغام مناسب رو به کاربر نشون داد.
ضمن اینکه میتونید متن مورد نظرتون رو هم از سمت سرور برای کلاینت ارسال مکنید تا بر اساس اون مقدار تصمیم گیری بشه. مثلا فرض کنید عملیات سمت سرور توسط صفحه دوم داره انجام میشه. بعد از اینکه عملیات مثلا insert تو بانک با موفقیت انجام شد، میتونید مقدار مثلا 1 رو با دستور

Response.Write("1");
برای کلاینت ارسال کنید ( یا مقدار 0 رو برای عدم موفقیت)
بعد به جای تابع parseResult توسط

xmlHttp.responseText
به مقدار ارسال شده از سرور، سمت کلاینت دسترسی پیدا کنید
ضمن اینکه دیگه با وجود jquery ajax و ... دیگه فکر نکنم احتیاجی باشه خودمون رو با readyState و ... درگیر کنیم.
jquery ajax خودش این موار رو پیاده کرده و ما کافیه فقط پارامترهای مورد نیازش رو بهش پاس بدیم
همین

minaalamshahi
یک شنبه 02 مرداد 1390, 14:42 عصر
میشه در مورد jquery ajax منو راهنمایی کنید

minaalamshahi
یک شنبه 02 مرداد 1390, 14:47 عصر
البته با توجه به اینکه من تا حالا jquery کار نکردم

minaalamshahi
یک شنبه 02 مرداد 1390, 15:36 عصر
با سلام
در استفاده از تکنولوژی ajax بدون ajax اگر با breakpoint جلو بریم
function WebForm_CallbackComplete() {
for (var i = 0; i < __pendingCallbacks.length; i++) {
callbackObject = __pendingCallbacks[i];
if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
WebForm_ExecuteCallback(callbackObject);
if (!__pendingCallbacks[i].async) {
__synchronousCallBackIndex = -1;
}
__pendingCallbacks[i] = null;
var callbackFrameID = "__CALLBACKFRAME" + i;
var xmlRequestFrame = document.getElementById(callbackFrameID);
if (xmlRequestFrame) {
xmlRequestFrame.parentNode.removeChild(xmlRequestF rame);
}
}
}
}

این کد ها رو می تونیم ببینیم

حالا چطور می تونم از callbackObject.xmlRequest.readyState == 4 که خود ajax به من میده استفاده کنم

minaalamshahi
یک شنبه 02 مرداد 1390, 15:38 عصر
من از دستورات شما استفاده کردم اما هیچ وقت تابع handleStateChange() چک نشد و اجرا به این دستور نرسید

Himalaya
یک شنبه 02 مرداد 1390, 15:46 عصر
من که نگفتم عینا اونا رو کپی پیست کنید. پروژتون رو اگه میتونید بزارید اینجا. یا یه برنامه کوچیک درست کنید و بزارید اینجا تا ببینیم مشکلش چیه

minaalamshahi
یک شنبه 02 مرداد 1390, 15:58 عصر
function handleStateChange() {if (xmlHttp.readyState == 4) {if (xmlHttp.status == 200) {parseResults();}}}
function parseResults()
{
}
function doAction()
{

document.getElementById("btnAddRecord").style.cursor = "wait";
document.body.style.cursor = "wait";
document.getElementById("Message").innerHTML = "...در حال ثبت اطلاعات. لطفا چند لحظه صبر کنید"; // You Can Also Use "Visibility" Property.

var sentData = "";
sentData += document.getElementById("txtName").value;
sentData += "|" + map+"|" + idsr ;
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = handleStateChange;

DoServerAction(sentData,'');
}

minaalamshahi
یک شنبه 02 مرداد 1390, 17:19 عصر
سلام
پروزه رو قرار دادم مشکل رو بررسی کنید ممنون میشم

Himalaya
یک شنبه 02 مرداد 1390, 17:26 عصر
اینو ببین. احتمالا به دردت بخوره.
روش استفاده شده، همون ClientCallback هستش. 2 تا تابع success , unsuccess رو هم میتونی از بلاک

$(document).ready(function() { });
بیاری بیرون