PDA

View Full Version : تاخیر دریافت اطلاعات در Ajax و قفل کردن Browser



Amir Shekari
جمعه 22 تیر 1386, 17:14 عصر
من یه برنامه با Ajax دارم که تو javascript یه متد را صدا می کنم چون اجرای اون متد حول وحوش 10 ثانیه طول میکشه تو این مدت Browser قفل میکنه میخواستم بدونم تو javascript یه چیزی شبیه doEvents در C# وجود داره
:متفکر:

Behrouz_Rad
جمعه 22 تیر 1386, 18:23 عصر
نحوه ی فراخوانی متدهای AJAX به شکل غیر خطی و نامتقارن است.
به همین دلیل مرورگر هیچگاه در هنگام اجرای یک فرمان AJAX ای Crash نمیکنه.
مشکل از اسکریپت شماست...

موفق باشید.

ealireza
جمعه 22 تیر 1386, 19:14 عصر
من یه برنامه با Ajax دارم که تو javascript یه متد را صدا می کنم چون اجرای اون متد حول وحوش 10 ثانیه طول میکشه تو این مدت Browser قفل میکنه میخواستم بدونم تو javascript یه چیزی شبیه doEvents در C# وجود داره
:متفکر:
یک راه وجود داره
در کل به دو صورت از MS Xml و Dom استفاده میکنم .!
بصورت مستقیم
بصورت مالتی ترد (همان CallBack)

شما باید سعی کنید بصورت CallBack این فرایند رو انچام بدین تا مرورگر منتظر دستور نمونه و هنگ نکنه .

موفق باشید

Behrouz_Rad
جمعه 22 تیر 1386, 22:02 عصر
شما باید سعی کنید بصورت CallBack این فرایند رو انچام بدین تا مرورگر منتظر دستور نمونه و هنگ نکنه .
مگه چند روش برای فراخوانی یک متد AJAX ای وجود داره؟

ealireza
شنبه 23 تیر 1386, 08:10 صبح
مگه چند روش برای فراخوانی یک متد AJAX ای وجود داره؟
خوب من یک مقدار توضیح میدم
در مورد Activex هایی که برای آجاکس استفاده میکنیم دو حالت برای نمایش نتیجه موجود هست .

حالت اول برای دریافت نتیجه مرورگر باید منتظر بمونه و ترد جدیدی برای اکتیوکس ایجاد نمیشود .
به کد زیر دقت کنید

xmlobj.open( "GET", null, false );
در این حالت با استفاده از

responseText
با راحتی به محتویات دسترسی پیدا میکنیم
اما اگه Latency کانکشن ما زیاد باشه یا ارسال پاسخ طول بکشه باعث هنگ کردن مرورگر میشه .

در حالت دوم

xmlobj.open( "GET", null, true);
این عملیات در یک Thread انجام میشه و مرورگر به کار خودش ادامه میده و دیگه منتظر پاسخ نمیمونه .
در این حالت فقط با CallBack میشه به اطلاعات دسترسی داشت .
از طریق تعریف یک تابع در

onreadystatechange

موفق باشید

Behrouz_Rad
شنبه 23 تیر 1386, 14:07 عصر
نیازی نیست که متقارن باشه.
همیشه نامتقارن فراخوانی کن.
فلسفه ی وجودی AJAX بر مبنای فراخوانی نامتقارن هست!
در onreadystatechange هم با استفاده از responseText داده های دریافتی بازیابی میشه:


xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
document.myForm.myTextBox.value=xmlHttp.responseTe xt;
}
}


موفق باشید.

aminbrleevb
سه شنبه 07 اردیبهشت 1389, 12:54 عصر
با سلام
ببخشید که بعد از مدت ها من تو این بخش پست میزنم
آقا من در پایین کدی رو گذاشتم که با اجرای اون در یک فایل صفحه قفل میشه
حالا شما بگویید که چی کار کنیم که هنگ نکنه یا تغییرش بدین



<html dir="rtl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>آگهی و تبلیغ رایگان اینترنتی در سایت دوردست</title>
<script type="text/javascript">

var rootdomain="http://"+window.location.hostname
function ajaxinclude(url) {
var xmlobj = false
if (window.XMLHttpRequest) // if Mozilla, Safari etc
xmlobj = new XMLHttpRequest()
else if (window.ActiveXObject){ // if IE
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP")
}
catch (e){
try{
xmlobj = new ActiveXObject("Microsoft.XMLHTTP")
}
catch (e){}
}
}
else
return false
xmlobj.open('GET', url, false) //get page synchronously
xmlobj.send(null)
writecontent(xmlobj)
}
function writecontent(xmlobj){
if (window.location.href.indexOf("http")==-1 || xmlobj.status==200)
document.write(xmlobj.responseText)
}

</script>

<script type="text/javascript">
ajaxinclude("http://www.google.com/")
</script>
</head>
<body>
salam barname ta loade kamel hang mikonad
</body>
</html>


با تشکر

Behrouz_Rad
سه شنبه 07 اردیبهشت 1389, 14:16 عصر
پارامتر سوم متد open رو برابر با true تنظیم کن... البته پیش فرضش true هست اما شما به false تنظیم کردی.

موفق باشید.

ehsan2007
سه شنبه 07 اردیبهشت 1389, 19:37 عصر
همچنین قابلیتی رو آجاکس پشتیبانی نمیکنه شما میخواین از روی سرور خودتون پاسخی از سرور گوگل دریافت کنید !!!!!!!!!!!!!!
Access is denied.

ajaxinclude("http://www.google.com/")

کدتونو اینجوری بنویسید


<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmldir="rtl">
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=windows-1252">
<title></title>
<scripttype="text/javascript">
function ajaxRequest(Url)
{
var AJAX;
try
{
AJAX = new XMLHttpRequest();
}
catch(e)
{
try
{
AJAX = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
AJAX = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e)
{
alert("Your browser does not support AJAX.");
returnfalse;
}
}
}
AJAX.onreadystatechange = function()
{
if(AJAX.readyState == 4)
{
if(AJAX.status == 200)
{
document.write(AJAX.responseText);



}
else
{
alert("Error: "+ AJAX.statusText +" "+ AJAX.status);
}
}
}
AJAX.open("GET", Url, true);
AJAX.send('');
}
</script>

</head>
<body>
salam barname ta loade kamel hang mikonad
<scripttype="text/javascript">
ajaxRequest(" آدرسی بر روی هاست خودتون")
</script>
</body>
</html>

موفق باشید

Behrouz_Rad
سه شنبه 07 اردیبهشت 1389, 20:21 عصر
همچنین قابلیتی رو آجاکس پشتیبانی نمیکنه شما میخواین از روی سرور خودتون پاسخی از سرور گوگل دریافت کنید !!!

البته الان یک draft وجود داره که Firefox از اون پشتیبانی می کنه. هدر Origin که مسیر URL درخواست کننده رو داره ارسال میشه و در صورتی که سرور مقصد اجازه میداد، با هدر Access-Control-Allow-Origin و مقدار * پاسخ میده... در حال حاضر روش های Cross Browser ای هم وجود دارند. سایت هایی که به عنوان یک Proxy برای درخواست شما عمل می کنند و از این طریق AJAX رو Cross Domain می کنند.
البته من در کدهای دوستمون، ارسال درخواست به google رو ندیدم بودم... به این شکل نمیشه به google درخواستی رو ارسال کرد.

موفق باشید.