PDA

View Full Version : سوال: انجام تغییرات حین اجرای دستورات، در AJAX



farzadsmc
یک شنبه 17 فروردین 1393, 12:38 عصر
بنده یک تابعی در PHP دارم که اجراش رو به طریق AJAX انجام میدم و نتیجه بعد از اتمام تابع رو صفحه چاپ میشود.
چکار میتونم انجام بدم تا نتیجه دستوراتی مثل echo در حین اجرای تابع بلافاصله در صفحه مشاهده شود و نه صرفا بعد از پایان تابع؟

من داخل تابع از چند دستور echo استفاده کردم ولی بعد از پایان تابع میشه نتایجشون رو دید.
یا مثلا میشود پیغام Please wait ای که در هنگام اجرا تابع به نمایش درمی آید را عوض کرد؟

در واقع کار تابعی که نوشتم سنگین و طولانی هست. من میخوام جزئیات تسک فعلی و درحال انجام رو به کاربر اطلاع بدم.
فرضا کنید تابع من از 3 مرحله تشکیل شده میخوام در حال انجام مرحله یک، پیغام "در حال انجام مرحله یک" و در مرحله دو پیغام "در حال انجام مرحله یک" پاک یا مخفی شده و پیغام "در حال انجام مرحله دو" نمایش داده بشه و الی آخر ...

این تابع جاول اسکریپتم هست :

jQuery(document).ready(function(jQuery){
jQuery("#submit").click(function(){
jQuery('.waitingmessage').css('display','block');
var txtAddress = jQuery('#txtAdd').val();
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {
"action": "process",
"add":txtAddress
},
success: function(data){
jQuery('#submit-result').html(data);
jQuery('.waitingmessage').hide();
}
});
});
});

MMSHFE
یک شنبه 17 فروردین 1393, 13:11 عصر
توی تابع خودتون، دستورات ob_end_flush و flush رو استفاده کنید.

us1234
یک شنبه 17 فروردین 1393, 13:59 عصر
به کد پی اچ پی زیاد مربوط نمیشه . ببیند تابع success پس از انجام عملیات کلیه نتایج را یکجا نمایش میده . برای اینکه در حین انجام عملیات بتونید نتایج را نمایش بدید باید از تابع های مثل زیر استفاده کنید :




xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}


منبع : http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

البته هنوز مطمئن نیستم این تابع جواب بده . باید تست بشه :خجالت:

farzadsmc
یک شنبه 17 فروردین 1393, 18:19 عصر
توی تابع خودتون، دستورات ob_end_flush و flush رو استفاده کنید.
تست کردم جواب نداد، بازهم وقتی تابع تمام میشود، نتایج نشون داده میشه، فکر میکنم همونطور که جناب us1234 گفتن باید تابع js رو تغییر بدم.



به کد پی اچ پی زیاد مربوط نمیشه . ببیند تابع success پس از انجام عملیات کلیه نتایج را یکجا نمایش میده . برای اینکه در حین انجام عملیات بتونید نتایج را نمایش بدید باید از تابع های مثل زیر استفاده کنید :




xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}


منبع : http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

البته هنوز مطمئن نیستم این تابع جواب بده . باید تست بشه :خجالت:

اینرو من رفتم نمونه کدش رو دیدم، مثلا توی رویداد onclick باتن، تابع رو فراخوانی میکرد. اینطوری چطور ارتباطش بدم با کدهای php ؟ یعنی بایستی بعد از هر مرحله باید اون تابع رو فراخوانی بکنم؟
روش تستش رو خلاصه نتونستم انجام بدم...

cpuram
یک شنبه 17 فروردین 1393, 19:06 عصر
چرا برای هر بار اجرا محدودیت نمیزارید؟
مثلا هر بار که اجرا میشه 50 فیلد رو بخونه.

farzadsmc
یک شنبه 17 فروردین 1393, 19:22 عصر
چرا برای هر بار اجرا محدودیت نمیزارید؟
مثلا هر بار که اجرا میشه 50 فیلد رو بخونه.
دقیقا متوجه منظورتون نشدم.
چرا باید مثلا 50 بار فیلد ورودی رو بخونم در حالی فقط با یکبار خواندن کارم انجام خواهد شد؟ البته من داده های دیگری هم از کاربر دریافت میکنم ولی اینجا برای پیچیده تر نشدن بقیه شون رو حذف کردم و فقط یکی رو باقی گذاشتم که نشون بدم از یوزر هم اطلاعاتی دریافت میکنم.
فقط چون روند اجرای تابع زمانگیر هست، (حدود 30-40 ثانیه) و مراحل مختلفی داره، میخوام کاربر رو از جزئیات روند اجرا مطلع کنم.

us1234
یک شنبه 17 فروردین 1393, 21:12 عصر
اینرو من رفتم نمونه کدش رو دیدم، مثلا توی رویداد onclick باتن، تابع رو فراخوانی میکرد. اینطوری چطور ارتباطش بدم با کدهای php ؟ یعنی بایستی بعد از هر مرحله باید اون تابع رو فراخوانی بکنم؟
روش تستش رو خلاصه نتونستم انجام بدم...

من برای آپلود فایل و اینکه هر لحظه که فایل آپلود شد یه درصد نشون بده از کد های این لینک زیر کمک گرفتم و جواب داد ولی در این مورد خاص شما نمیدونم ( باید فکر و تست کنم ) چی میشه .

نمونه کد آپلود
http://codular.com/javascript-ajax-file-upload-with-progress

cpuram
یک شنبه 17 فروردین 1393, 21:23 عصر
دقیقا متوجه منظورتون نشدم.
چرا باید مثلا 50 بار فیلد ورودی رو بخونم در حالی فقط با یکبار خواندن کارم انجام خواهد شد؟ البته من داده های دیگری هم از کاربر دریافت میکنم ولی اینجا برای پیچیده تر نشدن بقیه شون رو حذف کردم و فقط یکی رو باقی گذاشتم که نشون بدم از یوزر هم اطلاعاتی دریافت میکنم.
فقط چون روند اجرای تابع زمانگیر هست، (حدود 30-40 ثانیه) و مراحل مختلفی داره، میخوام کاربر رو از جزئیات روند اجرا مطلع کنم.
من فکر یه چیزی مثل بخش اتوماتیک سایت خبرخوان هست.واسه این گفتم اینطوری انجام بدید.
پس اینکارو انجام بدید
وسط کار هر چی اکو دارید جداگانه توی دیتابیس بنویسید و هر لحظه با ایجکس مقداری رو بخونید.

farzadsmc
یک شنبه 17 فروردین 1393, 21:23 عصر
دوستان با همون روشی که جناب us1234 گفتن مشکلم حل شد.
نمونه کد :


function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();
}
setInterval(loadXMLDoc, 1000);