Ajax变量值为javascript

我已经问了几个小时而没有发现任何问题……

我有一个注册表单供用户创建帐户。 按下提交按钮时,将调用validateForm函数。

在这个函数中,我做了一些有效的javascript测试,但后来我需要validation用户名是否可用。 为此,我创建了一个外部PHP文件,并使用$ .ajax调用它。

以下是代码的一部分:

function validateRegistration(){ // Some tests.... // Check if username is already used // Call external php file to get information about the username $.ajax({ url: 'AjaxFunctions/getUsernameAjax.php', data: "username=" + $("#username").val(), success: function(data){ // Username already in use if(data == "ko"){ // Stop validateForm() } // Username not used yet else{ // Continue tests } } }); // Other tests } 

我的问题是如何让validateForm()从$ .ajax中返回false? 我可以在Ajax部分之前声明一个js变量并使用Ajax设置它吗?

我想答案是显而易见的,但我是Ajax的新手,我无法得到它……

非常感谢你的帮助!

要实现这一点,您可以执行此答案中描述的同步ajax调用,但这对于您的网站性能来说是非常危险的。

或者 – 这是正确的方法 – 您应该有一个外部变量,无论用户名是否可用,只要用户输入您执行请求的内容,如果有效则更改变量,否则您会显示警告消息。 接下来在validateRegistration()函数中,您只检查外部变量(+可能是某种forms的回调,具体取决于您从哪里调用它)。 优点是用户仍然可以在请求待决时继续执行操作(例如填写表单的其余部分)。

您可以像现在一样进行同步 ajax调用,而不是异步调用。 这意味着Ajax调用将在下一行代码执行之前完成。

要在jQuery中执行此操作,只需将async: false添加到您的请求对象:

 var someVariable; $.ajax({ url: 'AjaxFunctions/getUsernameAjax.php', data: "username=" + $("#username").val(), success: function(data){ // Username already in use someVariable = "something"; if(data == "ko"){ // Stop validateForm() } // Username not used yet else{ // Continue tests } }, async: false }); alert(someVariable); // should alert 'something', as long as the ajax request was successful 

在php中,如果您打印出JSON,如:

 echo json_encode(array("ko"=>"good")); 

显示为:

 { "ko":"good" } 

然后在function中

 if(data.ko == "good"){ //do stuff } 

这就是我通常这样做的方式。 您可以使用您在JSON中使用的名称来获取变量,以便在需要时可以使用其他内容。

如果目标是检查用户名可用性,那么如何在输入用户名时检查它。例如,您可以将其绑定到keyUp事件以进行击键,或者将其绑定到离开文本框时的模糊事件。

这意味着当用户到达提交按钮时,表单的该部分已经被validation。

这里的传统解决方案是将回调函数传递给validateRegistration ,它需要一个布尔值。 让Ajax函数在完成时调用回调函数。

onsubmit处理程序需要一个返回值,因此在提交事件处理程序中执行异步测试是一种相当直观的方法。 您应该尽快执行测试(例如,一旦用户输入用户名),然后将用户名validation的结果存储在全局变量中,稍后在提交时检查。

 // global variable indicating that all is clear for submission shouldSubmit = false; // run this when the user enters an name, eg onkeyup or onchange on the username field function validateRegistration(callback) { shouldSubmit = false; // number of ajax calls should be minimized // so do all other checks first if(username.length < 3) { callback(false); } else if(username.indexOf("spam") != -1) { callback(false) } else { $.ajax({ .... success: function() { if(data == "ko") { callback(false); } else { callback(true); } } }); } } 

现在使用函数参数调用validateRegistration

 validateRegistration(function(result) { alert("username valid? " + result); if(result) { $("#username").addClass("valid-checkmark"); } else { $("#username").addClass("invalid-xmark"); } shouldSubmit = result; }); 

现在使用表单的submit事件处理程序中的全局变量shouldSubmit来选择性地阻止表单提交。