2

我已经解决了几个小时的问题,但没有发现任何问题......

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

在这个函数中,我做了一些有效的 javascript 测试,但是我需要验证用户名是否可用。为此,我创建了一个外部 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 完全陌生,我无法理解......

非常感谢你的帮助!

4

5 回答 5

1

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

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

于 2012-07-05T14:47:19.290 回答
0

您可以像现在所做的那样进行同步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
于 2012-07-05T14:47:35.593 回答
0

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

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

显示为:

{
 "ko":"good"
}

然后在函数中

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

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

于 2012-07-05T14:53:51.933 回答
0

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

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

于 2012-07-05T15:06:42.147 回答
0

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

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

// 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使用函数参数调用:

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

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

于 2012-07-05T15:22:26.807 回答