ورود

View Full Version : سوال: مشکل در اجرای مقادیر بازگشتی از تابع



مجتبی نکونام
چهارشنبه 11 فروردین 1395, 07:13 صبح
سلام دوستان
من میخوام از طریق رویداد onblur در یک input text مقدار ورودی رو از با ajax چک کنم
تابع فراخوانی میشه و از سرور php جواب رو دریافت میکنه
زمانیکه میخوام مقدار رو چک کنم انگار هر دو بخش if و else با هم اجرا میشه
کد html زیر :


<input type="text" id="username1" onblure="check_username();">

<span id="username"></span>

کد javascript زیر هم چک میکنه :


function check_username() {
var str = document.getElementById("username1").value;
var usermail , result;
var xhttp;
if (!str) {
document.getElementById("username").innerHTML = "این قسمت باید تکمیل گردد !";
document.getElementById("username").style.color = "red";
document.getElementById("username1").focus();
return;
}
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
result = xhttp.responseText.trim();
}
if (result !== "dorost"){
document.getElementById("username1").style.color = "red";
document.getElementById("username").innerHTML = xhttp.responseText;
}
if (result === "dorost"){
document.getElementById("username1").style.color = "green";
}
};
xhttp.open("POST", "checkusername.php", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("usermail="+str);
};


مقداری که از سرور برمیگرده یا "dorost" هست یا غیره.
ممنون میشم راهنمایی بفرمایید .

SCoder
چهارشنبه 11 فروردین 1395, 09:47 صبح
دوست عزیز این به این خاطر است که onreadystatechange چندین بار اجرا میشود هر بار با یک readyState ولی ما فقط به وقتی که جواب با موفقیت از سرور برگشت نیاز داریم بقیه state ها برای نشان دادن در حال بار گزاری و یا debugging هست و چون چند بار اجرا میشود اولین بار چون result ست نشده if سوم اجرا میشود و وقتی ست شد if های اول و دوم اجرا میشوند به همین خاطر شما دو if دوم و سوم را به داخل if اول ببرید درست میشود ...
موفق باشید .

مجتبی نکونام
چهارشنبه 11 فروردین 1395, 10:02 صبح
دوست عزیز این به این خاطر است که onreadystatechange چندین بار اجرا میشود هر بار با یک readyState ولی ما فقط به وقتی که جواب با موفقیت از سرور برگشت نیاز داریم بقیه state ها برای نشان دادن در حال بار گزاری و یا debugging هست و چون چند بار اجرا میشود اولین بار چون result ست نشده if سوم اجرا میشود و وقتی ست شد if های اول و دوم اجرا میشوند به همین خاطر شما دو if دوم و سوم را به داخل if اول ببرید درست میشود ...
موفق باشید .
دوست عزیز ضمن تشکر
اولش به همون صورتی بود که شما می فرمائید و نتیجه همین بود
مشکل در اینه که انگار نمیتونه بفهمه شرط برقرار هست یا نه ؟
یعنی result برابر با عبارت "dorost" هست یا خیر ؟
همین الان شرط دوم و سوم رو داخل شرط اول بردم اما تغییری نکرد
حتی بصورت if و else هم نوشتم ولی نشد.

SCoder
چهارشنبه 11 فروردین 1395, 10:33 صبح
این php :






<?php
#checkusername.php
if(isset($_POST['usermail'])){
if($_POST['usermail'] === 'php') echo "dorost";
else echo "Not dorost";
}




?>



و این html :





<html><head></head><body>
<input type='text' id='username1' value='' onblur="check_username()"/>

<span id='username'></span>


<script>
function check_username() {
var username1 = document.getElementById('username1'),
username = document.getElementById('username'),
str = username1.value,
usermail , result , xhttp;

if (!str) {
username.innerHTML = "این قسمت باید تکمیل گردد !";
username.style.color = "red";
username1.focus();
return;
}
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
result = xhttp.responseText.trim();
if (result !== "dorost"){
username1.style.color = "red";
username.innerHTML = result;
}else{
username1.style.color = "green";
}
}

};
xhttp.open("POST", "checkusername.php", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("usermail="+str);
};
</script>


</body>
</html>


حال اگر php بنویسید و blur کنید green میشود و غیر آن Red ...
موفق باشید .

مجتبی نکونام
پنج شنبه 12 فروردین 1395, 06:08 صبح
خیلی ممنون ولی باز هم نشد :ناراحت: