2017-05-28 40 views
0

我不知道我是否用自己的圖塊讓自己清楚,我認爲它很混亂,但讓我解釋一下。 所以我有一個js代碼:使用javascript從主函數內部返回一個子函數的值

function validateUserLogin() { 
    'use strict'; 
    var xmlhttp, url = '../controller.php?action=validatelogin', 
    email = document.getElementById('email').value, 
    password = document.getElementById('password').value; 
    if (window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 
    } else { 
     alert('Your browser does not support XMLHTTP!'); 
    } 
    xmlhttp.open('POST', url, true); 
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
    xmlhttp.send('email=' + email + '&password=' + password); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
      if (xmlhttp.responseText === 'Error1') { 
       $('#email').css('border', '1px solid red'); 
       //A value to return 
      } 
      if (xmlhttp.responseText === 'Error2') { 
       $('#email').css('border', '1px solid green'); 
       $('#password').css('border', '1px solid red'); 
       //A value to return 
      } 
     } 
    }; 
    //I want it here 
} 

在上面的代碼我有,當他嘗試登錄發送Ajax請求驗證用戶的功能。在服務器端腳本中,當電子郵件或密碼不正確時,我會回顯一條消息,並將輸入的邊框顏色更改爲綠色或紅色。到現在爲止還挺好。我想要的只是將2個ifs中的變量從子函數中返回給validateUserLogin,然後向登錄表單返回true或false。這甚至有可能嗎?

回答

0

只需使用先前聲明的var? (stored此處)

您可以使用xmlhttp.open('POST', url, false);作爲同步請求發送。

我用一個加載監聽器代替了你的.onreadystatechange,爲我在這個小提琴上工作:https://jsfiddle.net/1ma3svcd/ 被調用的PHP文件只是返回'Error1'。

var xmlhttp; 

function validateUserLogin() { 
    'use strict'; 
    var stored; 
    var url = 'https://zenoo.fr/testAjax.php', 
    email = '[email protected]', 
    password = 'testMe'; 
    if (window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 
    } else { 
     alert('Your browser does not support XMLHTTP!'); 
    } 

    xmlhttp.addEventListener("load", transferComplete, false); 
    xmlhttp.open('POST', url, false); 
    xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
    xmlhttp.send('email=' + email + '&password=' + password); 
} 

function transferComplete(){ 
     if (xmlhttp.responseText === 'Error1') { 
     $('#email').css('border', '1px solid red'); 
     stored=true; 
     } 
     if (xmlhttp.responseText === 'Error2') { 
     $('#email').css('border', '1px solid green'); 
     $('#password').css('border', '1px solid red'); 
     stored=false; 
     } 

     console.log(stored); 
} 


validateUserLogin(); 
+0

您可以使用第二個參數的。開以獲得同步調用:'XMLHTTP。打開('POST',url,false);' – Zenoo

+0

仍未定義 –

+0

我混淆了.open和.send函數。嘗試使用.open()函數設置false。 – Zenoo

-1

@Zenoo回答沒有,因爲你不能工作:阿賈克斯是異步的,也就是說,當你在最後一行(「//我希望它有」)到達瀏覽器可能尚未發送Ajax請求。

你可以傳遞一個回調函數

+0

來吧夥計,你可以讓一個AJAX調用同步... – Zenoo

+0

即使你可以,@John是以異步方式實現它 – bennes

+0

是的@John,我的意思是一個回調函數傳遞給onreadystatechange – bennes

0

這是不可能的,因爲HttpRequest的是異步。這意味着你的函數在返回一個值之前不會等待請求完成。

我不知道你想在這裏實現什麼,但我懷疑在表單的onsubmit處理程序中正在使用方法validateUserLogin()

如果是這樣的話,那麼我會建議你使用某個事件偵聽器,而不是

例如:

var form = document.getElementById('login-form'); 
form.addEventListener('submit', function(e){ 
    // Prevent form from loading the page (submit) 
    e.preventDefault(); 

    // Then call your function here 
    // If user was logged in without errors, 
    // You can use in your function "window.location.href = 'http://mywebapp.dev/dashboard'" 
    validateLogin(); 
}); 
+0

很高興我可以的幫助。 –

相關問題