关于php:jax的Ajax变量值

Ajax variable value to javascript

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

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

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

以下是代码的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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()函数中,您只检查外部变量(+可能是某种形式的回调,具体取决于您从哪里调用它)。优点是用户仍然可以在请求待决时继续执行操作(例如填写表单的其余部分)。


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// global variable indicating that all is clear for submission
shouldSubmit = false;

// run this when the user enters an name, e.g. 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

1
2
3
4
5
6
7
8
9
validateRegistration(function(result) {
    alert("username valid?" + result);
    if(result) {
        $("#username").addClass("valid-checkmark");
    } else {
        $("#username").addClass("invalid-xmark");
    }
    shouldSubmit = result;
});

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


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

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


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

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

显示为:

1
2
3
{
"ko":"good"
}

然后在功能中

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

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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