View Full Version : سوال: چرا توی کدهای زیر مقدار xmlHttp.readyState همواره برابر 0 هست؟
i-php-i
چهارشنبه 14 اردیبهشت 1390, 15:16 عصر
من برای آژاکس از کدهای زیر استفاده می کنم (همه کدهایی که استفاده می کنم رو اینجا قرار دادم).
کد اول شی XMLHttpRequest رو ایجاد می کنه، کد دوم اطلاعات رو به سرور می فرسته و کد سوم اطلاعات رو از سرور دریافت می کنه.
کد چهارم هم اسکریپت پی اچ پی هست که اطلاعات براش فرستاده می شن.
مشکل اینجاست که اگر توی هر کدوم از دو تابع مقدار xmlHttp.readyState رو نمایش بدیم، می بینیم که صفر برمی گردونه و اگر کد سوم مقدار xmlHttp.status رو نمایش بدیم، مقدار 0 برمی گردونه.
موقع ارسال فرم، خطای زیر هم نمایش داده می شه.
امکان اتصال به سرور وجود ندارد
[Exception... "Could not convert JavaScript argument arg 0 [nsIXMLHttpRequest.onreadystatechange]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://localhost/admin/paper/ajax.js :: process :: line 35" data: no]به دلیل وجود داشتن این مشکلات، نمی تونم کد آژاکس بنویسم. دلیل این مشکلات چی هست؟ لطفا توضیح بدید.
var xmlHttp = new XMLHttpRequest();
function process()
{
var ptitle = document.getElementById('pTitle').value;
if(xmlHttp.readyState==4 || xmlHttp.readyState==0)
{
try
{
// alert (xmlHttp.readyState); return false;
xmlHttp.open("POST","ajax.php",true);
xmlHttp.onreadystatechange=handleServer();
xmlHttp.send('pTitle=' + ptitle);
}
catch (e)
{
alert ("امکان اتصال به سرور وجود ندارد\n" + e.toString());
return false;
}
}
else { alert ("امکان انجام درخواست شما وجود ندارد، لطفا مجددا تلاش کنید."); return false;}
}
function handleServer()
{
// alert (xmlHttp.status);return false;
if(xmlHttp.readyState==4 && xmlHttp.==200)
{
try
{
handleRespons();
}
catch(e)
{
alert (".هنگام دریافت داده ها از سرور مشکلی رخ داده است\n" +
e.toStrin());
}
}
else
{
alert (".هنگام دریافت داده ها از سرور مشکلی رخ داده است\n" +
xmlHttp.statusText);
}
}
<?php
$res='<?xml version="1.0" encoding="utf-8"?>'.'<response><result>'."$_POST[pTitle]".'</result></response>';
header ('content-Type: text/xml');
echo "$res";
?>
hossin.esm
پنج شنبه 15 اردیبهشت 1390, 09:20 صبح
روش کد نویسی شما درست نیست.
یک نمونه را از لینک زیر ببینید.
http://www.w3schools.com/ajax/ajax_xmlfile.asp
i-php-i
پنج شنبه 15 اردیبهشت 1390, 10:54 صبح
روش کد نویسی شما درست نیست.
یک نمونه را از لینک زیر ببینید.
http://www.w3schools.com/ajax/ajax_xmlfile.asp
مرسی ظاهرا من توی کد نویسی مشکل دارم.
i-php-i
پنج شنبه 15 اردیبهشت 1390, 12:24 عصر
روش کد نویسی شما درست نیست.
یک نمونه را از لینک زیر ببینید.
http://www.w3schools.com/ajax/ajax_xmlfile.asp
من فقط با بخش اتصال به سرور مشکل دارم.
یه نمونه کد خیلی ساده که ازش استفاده می کنم رو در ادامه قرار می دم، این کد هیچ مقداری نمایش نمی ده. اگه می شه لطف کنید و کد رو اصلاح کنید تا بتونم بدون مشکل ازش استفاده کنم و به سرور وصل بشم.
توی این کد، برای سادگی شی xmlhttp رو فقط برای مرورگرهای غیر از اینترنت اکسپلورر می سازیم.
کد سمت کلاینت
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
alert('okokok');
}
else
{
alert('nonono');
}
}
xmlHttp.open("POST","ajax.php",true);
xmlHttp.send('pTitle=ptitle');
کد سمت سرور
<?php
$res='<?xml version="1.0" encoding="utf-8" ?><response><result>Server Response is ok</result></response>';
header ('content-Type: text/xml');
echo "$res";
//exit;
?>
hossin.esm
پنج شنبه 15 اردیبهشت 1390, 13:50 عصر
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="myDiv">
</div>
<form id="form1" name="form1" method="post" action="ajax.php" onSubmit="return false;" >
<label>عنوان مقاله
<input name="pTitle" type="text" id="pTitle" maxlength="300" size="100" value="<?php echo "عنوان"; ?>" />
</label>
<input type="submit" value="ارسال" onclick="process()"/>
</form>
<script type="text/javascript" >
var xmlHttp=null;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlHttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
function process()
{
var ptitle = document.getElementById('pTitle').value;
if(xmlHttp!=null)
{
xmlHttp.open("POST","ajax.php",true);
xmlHttp.onreadystatechange=handleServer;
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send('pTitle='+ptitle);
}
else {
alert ("مرورگر شما از آژاکس پستیبانی نمیکند");
return false;
}
}
function handleServer()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
x=xmlHttp.responseXML.documentElement.getElementsB yTagName("result")[0];
alert (x.firstChild.nodeValue+" :نتیجه ");
}
else
{
alert ("خطا در آژاکس");
}
}
}
</script>
</body>
</html>
<?php
$s='';
if(isset($_POST['pTitle']))
$s=$_POST['pTitle'];
$res='<?xml version="1.0" encoding="utf-8"?>'.'<response><result>'.$s.'</result></response>';
header ('content-Type: text/xml');
echo $res;
?>
i-php-i
پنج شنبه 15 اردیبهشت 1390, 16:19 عصر
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="myDiv">
</div>
<form id="form1" name="form1" method="post" action="ajax.php" onSubmit="return false;" >
<label>عنوان مقاله
<input name="pTitle" type="text" id="pTitle" maxlength="300" size="100" value="<?php echo "عنوان"; ?>" />
</label>
<input type="submit" value="ارسال" onclick="process()"/>
</form>
<script type="text/javascript" >
var xmlHttp=null;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlHttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
function process()
{
var ptitle = document.getElementById('pTitle').value;
if(xmlHttp!=null)
{
xmlHttp.open("POST","ajax.php",true);
xmlHttp.onreadystatechange=handleServer;
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send('pTitle='+ptitle);
}
else {
alert ("مرورگر شما از آژاکس پستیبانی نمیکند");
return false;
}
}
function handleServer()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
x=xmlHttp.responseXML.documentElement.getElementsB yTagName("result")[0];
alert (x.firstChild.nodeValue+" :نتیجه ");
}
else
{
alert ("خطا در آژاکس");
}
}
}
</script>
</body>
</html>
<?php
$s='';
if(isset($_POST['pTitle']))
$s=$_POST['pTitle'];
$res='<?xml version="1.0" encoding="utf-8"?>'.'<response><result>'.$s.'</result></response>';
header ('content-Type: text/xml');
echo $res;
?>
ممنون از توجهتون.
من کد های شما رو دقیقا بجای کدهای خودم استفاده کردم ولی مقدار "خطا در آژاکس" نمایش داده می شد.
دلیل این چی هست؟الان داشتم کدهای خودم رو تغییر می دادم که به این نتیجه رسیدم:
اگر بعد از شرط if، یه شرط else اظافه کنیم و و مقدار readyState رو نمایش بدیم. این شرط ابتدا 1، 2 و 3 را نمایش می دهد.
سپس شرط if که همان پاسخ سرور است نمایش داده می شود و بعد از نمایش پاسخ سرور مقدار 4 نمایش داده می شود.
در این کدها همواره مقدار xmlHttp.status برابر صفر هست.
کدی که استفاده کردم رو براتون قرار دادم.
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4)
{
alert(xmlHttp.responseText);
}
else
{
alert(xmlHttp.readyState);
}
}
xmlHttp.open("POST","ajax.php",true);
xmlHttp.send('pTitle=ptitle');
hossin.esm
پنج شنبه 15 اردیبهشت 1390, 16:44 عصر
دلیل اینکه xmlHttp.status همواره برابر 0 هست چون کد ها روی هاست نیست
اگر کد را روی هاست تست کنید درست جواب میده.
i-php-i
پنج شنبه 15 اردیبهشت 1390, 19:14 عصر
دلیل اینکه xmlHttp.status همواره برابر 0 هست چون کد ها روی هاست نیست
اگر کد را روی هاست تست کنید درست جواب میده.
من از XAMPP استفاده می کنم.
یعنی این برنامه نمی تونه محیط یه سرور رو شبیه سازی کنه؟
چرا وقتی شرط if رو بدون else بکار می برم، فقط یک پنجره خالی نمایش داده می شه اما وقتی شرط else رو اضافه می کنم ابتدا 1، 2 و 3 را نمایش داده می شه. بعد شرط if که پاسخ سرور است رو نمایش می ده؟
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4)
{
alert(xmlHttp.responseText);
}
else
{
alert(xmlHttp.readyState);
}
}
xmlHttp.open("POST","ajax.php",true);
xmlHttp.send('pTitle=ptitle');
hossin.esm
پنج شنبه 15 اردیبهشت 1390, 23:12 عصر
من از XAMPP استفاده می کنم.
یعنی این برنامه نمی تونه محیط یه سرور رو شبیه سازی کنه؟
من خیلی با XAMPP نکردم. به هر حال اگر هاست دم دست دارید تست کنید.
چرا وقتی شرط if رو بدون else بکار می برم، فقط یک پنجره خالی نمایش داده می شه اما وقتی شرط else رو اضافه می کنم ابتدا 1، 2 و 3 را نمایش داده می شه. بعد شرط if که پاسخ سرور است رو نمایش می ده؟
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4)
{
alert(xmlHttp.responseText);
}
else
{
alert(xmlHttp.readyState);
}
}
xmlHttp.open("POST","ajax.php",true);
xmlHttp.send('pTitle=ptitle');
onreadystatechange رویدادی است هنگام تغییر readyState رخ میده و readyState هم وضعیت اتصال به سرور و دریافت اطلاعات را نشان میده.
مثلا عدد 1 نشان دهنده برقراری ارتباط با سرور هست.
i-php-i
جمعه 16 اردیبهشت 1390, 00:14 صبح
من خیلی با XAMPP نکردم. به هر حال اگر هاست دم دست دارید تست کنید.
onreadystatechange رویدادی است هنگام تغییر readyState رخ میده و readyState هم وضعیت اتصال به سرور و دریافت اطلاعات را نشان میده.
مثلا عدد 1 نشان دهنده برقراری ارتباط با سرور هست.
مشکل به طور کامل حل شد. با سرور تماس می گیرم، پاسخ سرور رومی خونم و نمایش می دم.
مشکل این بود که تابع process رو به صورت زیر فراخوانی می کردم.
<form id="form1" name="form1" method="post" action="new.php" onSubmit="return process()"> الان با قرار دادن این تابع توی تگ مربوط به دکمه ارسال، همه چیز به خوبی پیش می ره. مقدار status هم 200 هست.
hmkhafan
سه شنبه 24 دی 1392, 13:56 عصر
آقا میشه بگید مشکل از کجا بود؟ آخه منم همین مشکل رو دارم
kb0y667
یک شنبه 06 بهمن 1392, 04:16 صبح
آقایون ، غلط و قلوت زیاد دارید
نکته اول :
تا جای ممکن از متد GET استفاده بشه و نه از POST
دوم :
در متد GET بعد از open کردن ، چیزی نباید توسط ()send ارسال بشه >> ;(send(null درسته
سوم :
در متد پست شما باید اول یه متغییرهای input رو جمع کنی
یه فرم مجازی بسازی
متغییرها رو بریزی توی فرم مجازی
درنهایت از طریق send فقط فرم مجازی بایست ارسال شود
input1=document.getElementById('text_one').value;
input2=document.getElementById('select_two').selec tedIndex;
virtualForm=new FormData();
virtualForm.append("text_one_name",input1);
virtualForm.append("select_two_name",input2);
xmlHTTPr.send(virtualForm);
فقط بخش های مهم رو نوشتم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.